mhs*_*hsc 3 go protocol-buffers grpc
也许我有点错过了 Protobufs 的要点,但我花了一些时间来实现它,因为我希望与我当前的 JSON 设置相比获得原始速度。
我的用例是这样的:一个大型、复杂的 PHP 应用程序(不是网站),正在生产中并被大量使用。我们现在尝试将应用程序分成更小的部分,并用适合每个问题的语言编写。我拆分出来的第一个服务对字符串进行处理和转换,非常特定于领域,而且不是很有趣。涉及大量正则表达式、自定义解析等。
我用 Go 实现了我的领域逻辑,它工作得很好而且很容易上手。我使用 Go-Kit 将逻辑附加到一个简单的 JSON API。是一个非常简单的转换,json 编码只是类似于 {"v":"some string 通常 10-100 个字符"}。
性能比原生 PHP 差,考虑到 JSON 的开销和增加的网络层传输,我认为这是可以接受的。
然而,真正让我惊讶的是,Protobuf 不但没有比 JSON 快,反而慢了 30-50%。
我的.proto:
syntax = "proto3";
package pb;
option optimize_for = SPEED;
service StringStuff {
rpc DoStringStuff (StringReq) returns (StringRes) {}
}
message StringReq {
string in = 1;
}
message StringRes {
string out = 1;
}
Run Code Online (Sandbox Code Playgroud)
我使用了https://github.com/stanley-cheung/Protobuf-PHP和生成的 proto php 代码。我的php客户端代码是这样的:
$client = new StringClient('localhost:50051', [
'credentials' => \Grpc\ChannelCredentials::createInsecure()]);
$string = new StringReq();
$string->setIn("some string...");
list($reply, $status) = $client->DoStringStuff($string)->wait();
Run Code Online (Sandbox Code Playgroud)
它可以工作,但令我惊讶的是它比 JSON 慢很多。
我唯一的猜测:Protobufs 的 php 实现是否可能比 json_decode 慢得多,以至于目前 PHP 为 Protobuf 提供了一个非常糟糕的客户端?
或者对于小型、简单的用途(例如传输单个字符串),JSON 应该胜过 Protobuf,这是否正常?
感谢您的任何想法。
protobuf
安装时使用的本机 PHP 实现composer require google/protobuf
比protobuf C 扩展慢得多。要从 gRPC 中获得真正的性能,您需要安装 protobuf C 扩展:
pecl install protobuf
Run Code Online (Sandbox Code Playgroud)
并启用它php.ini
extension=protobuf.so
Run Code Online (Sandbox Code Playgroud)
这将在 C 中而不是在 PHP 中完成所有序列化/反序列化,这将比 PHP 版本快很多倍。
归档时间: |
|
查看次数: |
2850 次 |
最近记录: |