DRPC:我们对GRPC的更换

2021-04-28 10:51:23

2016年,谷歌推出了GRPC,其整体地通过风暴拍摄了系统编程社区。 GRPC代表了G,远程过程呼叫的东西;它' s一种在两个不同远程服务之间轻松定义接口的机制。它与协议缓冲器版本3紧密捆绑在一起(来自Google的另一个高度采用的数据交汇处),似乎每个人都在使用它。维基百科,广场,Netflix,IBM,Docker,蟑螂实验室,思科,Spotify,Dropbox等,都使用GRPC。

在Storj,我们在分散的云存储中的先驱。到2018年初,我们构建并缩放了150个Petabyte分散的存储网络。当然,像每个好的比例故事一样,当我们到达150岁的Petabytes时,我们发现了一些需要重新制作的基本架构问题。盯着几十万行的桶的桶,有......一种体面的测试覆盖,我们在2018年3月制造了危险的决定,以便在去的次要重新实现方面修复这些架构问题。我们'重新召开这种迭代我们的V3网络,它在2020年3月开始推出。您可以阅读我们的白皮书中的所有建筑,您可以尝试我们的直播服务。

显然,从地上建立一个新的分散存储平台,我们考虑使用GRPC来简化我们在点对点远程过程调用中的开发过程。事实上,我甚至不确定我们真的被认为是别的什么。使用GRPC为我们是故意决定避免使用创新令牌。 GRPC如何成为错误的选择?它具有令人印象深刻的凭据和广泛的用法。我们总是失望的谷歌并没有发布标准的RPC实现。通过以前与协议缓冲区的完全强烈的积极经验,我们很高兴能够跳到新的Protobuf RPC土地上。

快进到2019年下半年后,我们有170k线,一个超过4磅的测试网络,真正的活跃的用户,事实证明我们为自己制造的GRPC床并非所有玫瑰,而且我们有点在它中稍微大便。只是一点点。这个很多 - > ||< - 。所以不多,但仍然。

所以我们重写GRPC并迁移我们的实时网络。 DRPC是一个开源的替代品,处理我们在3000线以下的GRPC(以及最有可能的一切)所需的一切。它现在为我们的全部网络提供了数万种服务器和无数客户。

让我们刚出去这里说出什么是不够的人在一个简单的人中,Grpc拥有蠕变,臃肿,并试图解决太多问题。它过度自由化,已成为倾销的特色,纠结在基于标准的废话垃圾网。

你知道有40个不同的拨号选择吗?有26个服务器选项。你有13个电话选项。 GRPC是巨大的。导致我们远离GRPC的一个主要问题是它在我们自己(相当大的)二进制文件中构成。

您是否使用GRPC的内置API进行内部负载平衡?你可能没有 - 你的负载平衡器可能会做其他事情。您是否使用手动名称解析库?你发现自己不确定的操作是同步的吗?等等,我们应该用whelock吗? GRPC倾向于累积功能,以便它试图解决每个问题,并且每个解决方案都有更多的代码来维护,令人担忧的错误和额外的语义。

另一方面,DRPC的核心低于3000线!审核和理解它是一个合理的任务。

这款Tweet是2019年,as今天,在2021年,vitefaultserviceConfig仍然是实验性的,并且仍被弃用了Balancername。

在这份写作时,顶级GRPC文档中有37个弃用通知。这使得很难了解你应该使用的是什么,你不应该使用什么,有什么东西可以使用。

81%的堆用节点的堆用节点是GRPC。你不能使用另一个protobuf库;有大量的分配,你得到自己的http / 2服务器,并击中了。

基于Protobuf的协议具有幸运能力,避免了传统旧协议的复杂字符串解析和开销,例如HTTP,除非您使用GRPC。然后,您必须处理HTTP / 2以及可能出现的所有传统边缘案例。

POP测验:想象一下,您正在尝试调试在拨号连接期间发生的问题,您使用https://pkg.go.dev/google.golang.org/grpc#withcontextdialer。看看您是否可以在GRPC代码库中找到您提供的功能,所以调用。

GRPC比DRPC的代码行至少10倍,并且可以安全地说一些API有机地增长,很难理由。

是的!考虑到我们有170K的GO线,紧紧融入GRPC的单一和流媒体请求风格,2019年,我们将选择缩小为:

我们真的很想避免不得不更改已经在GRPC注册的每个服务。再次,服务很好,我们只需要更改连接层。节俭是一个非常大的出发,因为我们所有的代码都是如此,所以我们消除了它。也许从求职者开始,我们会判断并怀疑它不是最佳的开始。

我们可以出于同样的原因淘汰Twirp,但Twirp还有另一个问题 - 我们需要支持双向流的支持,Twirp没有它。

分叉GRPC可能是一个不错的选择,但我们突然对所有这些都负责,因为我们撕掉了我们不需要的零件。撕掉了单独的HTTP / 2的开销本身基本上是重写。它似乎是一个更简单的事项开始新鲜。

所以,我们决定用时代来写自己的实验。实验是一种粉碎的成功。

DRPC是GRPC客户端/服务器交互的代码替换。如果您今天使用GRPC,则应该能够将协议缓冲生成管道交换给DRPC并在您的路上。如果您已经有proto3 .proto文件,则可以告知Protoc Protobuf编译器以生成DRPC代码而不是GRPC代码(或两者,如果您'重新迁移)。

DRPC在其斯巴达几千行中支持各种功能。 DRPC巧妙地快速轻便(例如,例如,协议不需要HTTP标题解析),它支持酉和流媒体请求,它有一个HTTP / JSON网关,它支持每个请求的侧通道信息,如跟踪,它支持分层和中间件等。

另一定要查看我们的GitHub Readme上的GRPC VS DRPC基准。我想专门调用内存使用DRPC的更好。 GC压力很糟糕!当您有高性能服务器时,降低GC压力始终是一个很好的呼叫。

它的价值指出DRPC与GRPC不同的协议,DRPC客户端不能与GRPC服务器交谈,反之亦然。

我们面临的一个主要挑战是我们已经部署了GRPC。我们需要支持DRPC和GRPC客户端进行过渡期,直到所有内容都理解GRPC。

因此,我们写道(并包含在DRPC中)迁移助词允许您倾听并响应同一端口上的DRPC和GRPC请求。确保查看https://pkg.go.dev/storj.io/drpc/drpcmigrate#listenmux和我们的grpc和drpc示例:https://github.com/storj/drpc/tree/main/examples/grpc_and_drpc

释放并部署新的服务器代码,并同时了解GRPC和DRPC。使用DRPC,这是一个微风,因为我们所有的应用程序代码都可以与两者相同使用,我们的Listenmux允许我们从同一服务器端口执行。

一旦更新所有服务器和节点,就会发布并部署辐注DRPC而不是GRPC的新客户端。

我们立即消除了一整套缺乏的WAN网络错误(我们的可用性指标上升),提高性能和降低的CPU和资源利用率,显着降低了我们的二进制大小,并且整体而言,更快乐。

DRPC,就像Storj的几乎所有其他东西一样,是开源。 DRPC是MIT / EXPAT许可,我们喜欢你的帮助!由于我们目前只有DRPC的GO绑定,新语言的绑定将是一个很好的开始。

随意查看我们的GitHub repo,让我们知道我们是否可以帮助您潜入!

Storj Labs正在构建下一代云对象存储。我们的分散方法使我们更安全和私有,而不是现有的云对象存储提供商。没有什么比试图为自己销售我们的产品。注册,或在HTTPS://link.us1.storjshare.io/s/jvgmjntaucpfedohxn3ogdrsfcfa/homepage/tardigradeexplainervideo.m4v中查看我们的服务

Storj Labs正在寻找希望成为分散未来的一部分的开发人员。我们有很多开口。如果您有兴趣,请给我发电子邮件!