热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

GRPC:在Java/Scala中成为高吞吐量客户端

我有一项服务,可以以很高的速率传输邮件。当前,它由akka-tcp服务,每分钟发

我有一项服务,可以以很高的速率传输邮件。

当前,它由akka-tcp服务,每分钟发送350万条消息。我决定尝试一下grpc。
不幸的是,它导致吞吐量大大降低:每分钟约50万条消息,甚至更低。

请介绍如何对其进行优化?

我的设置

硬件:32核,24Gb堆。

grpc版本:1.25.0

消息格式和终结点

消息基本上是一个二进制blob。
客户端将100K-1M和更多消息流传输到同一请求中(异步),服务器不响应任何内容,客户端使用无操作观察者

service MyService {
rpc send (stream MyMessage) returns (stream DummyResponse);
}
message MyMessage {
int64 someField = 1;
bytes payload = 2; //not huge
}
message DummyResponse {
}

问题:
与akka实施相比,邮件速率较低。
我观察到CPU使用率较低,因此我怀疑grpc调用实际上在内部阻塞,尽管它另有说明。确实不会立即返回调用onNext(),但表上还存在GC。

我试图产生更多的发件人来缓解此问题,但并没有太大的改进。

我的发现
Grpc序列化时实际上为每个消息分配8KB字节的缓冲区。查看堆栈跟踪:


  

java.lang.Thread.State:已阻止(在对象监视器上)
          在com.google.common.io.ByteStreams.createBuffer(ByteStreams.java:58)
          在com.google.common.io.ByteStreams.copy(ByteStreams.java:105)
          在io.grpc.internal.MessageFramer.writeToOutputStream(MessageFramer.java:274)
          在io.grpc.internal.MessageFramer.writeKnownLengthUncompressed(MessageFramer.java:230)
          在io.grpc.internal.MessageFramer.writeUncompressed(MessageFramer.java:168)
          在io.grpc.internal.MessageFramer.writePayload(MessageFramer.java:141)
          在io.grpc.internal.AbstractStream.writeMessage(AbstractStream.java:53)
          在io.grpc.internal.ForwardingClientStream.writeMessage(ForwardingClientStream.java:37)
          在io.grpc.internal.DelayedStream.writeMessage(DelayedStream.java:252)
          在io.grpc.internal.ClientCallImpl.sendMessageInternal(ClientCallImpl.java:473)
          在io.grpc.internal.ClientCallImpl.sendMessage(ClientCallImpl.java:457)
          在io.grpc.ForwardingClientCall.sendMessage(ForwardingClientCall.java:37)
          在io.grpc.ForwardingClientCall.sendMessage(ForwardingClientCall.java:37)
          在io.grpc.stub.ClientCalls $ CallToStreamObserverAdapter.onNext(ClientCalls.java:346)

在构建高吞吐量grpc客户方面的最佳实践方面的任何帮助都受到赞赏。



我通过在每个目的地创建多个ManagedChannel实例解决了该问题。尽管有文章说ManagedChannel本身可以产生足够的连接,所以一个实例就足够了,在我看来,这不是真的。

性能与akka-tcp实现相当。

,

有趣的问题。计算机网络软件包使用stack of protocols进行编码,并且这些协议是在前一个协议的规范之上构建的。因此,由于要在基础协议之上添加额外的编码/解码步骤,因此协议的性能(吞吐量)受用于构建协议的性能的限制。

例如,gRPC构建在HTTP 1.1/2之上,而L7 Application层​​em>或HTTP上的协议,因此其性能为受HTTP的性能约束。现在TCP本身是建立在L4之上的,而gRPC位于传输层TCP,因此我们可以推断出TCP的吞吐量不能大于gRPC层中提供的等效代码。

换句话说:如果您的服务器能够处理原始DbContext包,那么增加新的复杂性层(DbContext)会如何提高性能?

,

我对Akka TCP在这里的出色表现印象深刻:D

我们的经验略有不同。我们正在使用Akka Cluster处理更小的实例。对于Akka远程处理,我们使用Artery从Akka TCP更改为UDP,并实现了更高的速率+更低的响应时间和更稳定的响应时间。 Artery中甚至有一个配置,有助于在CPU消耗和冷启动响应时间之间取得平衡。

我的建议是使用一些基于UDP的框架,该框架也为您提供传输可靠性(例如,Artery UDP),并且仅使用Protobuf进行序列化,而不是使用完整的gRPC。 HTTP / 2传输通道并不是真正用于高吞吐量,低响应时间的目的。


推荐阅读
  • 本文全面解析了 gRPC 的基础知识与高级应用,从 helloworld.proto 文件入手,详细阐述了如何定义服务接口。例如,`Greeter` 服务中的 `SayHello` 方法,该方法在客户端和服务器端的消息交互中起到了关键作用。通过实例代码,读者可以深入了解 gRPC 的工作原理及其在实际项目中的应用。 ... [详细]
  • 本文档介绍了如何使用ESP32开发板在STA模式下实现与TCP服务器的通信,包括环境搭建、代码解析及实验步骤。 ... [详细]
  • Docker安全策略与管理
    本文探讨了Docker的安全挑战、核心安全特性及其管理策略,旨在帮助读者深入理解Docker安全机制,并提供实用的安全管理建议。 ... [详细]
  • 本文介绍了SIP(Session Initiation Protocol,会话发起协议)的基本概念、功能、消息格式及其实现机制。SIP是一种在IP网络上用于建立、管理和终止多媒体通信会话的应用层协议。 ... [详细]
  • CentOS下ProFTPD的安装与配置指南
    本文详细介绍在CentOS操作系统上安装和配置ProFTPD服务的方法,包括基本配置、安全设置及高级功能的启用。 ... [详细]
  • Web动态服务器Python基本实现
    Web动态服务器Python基本实现 ... [详细]
  • 深入解析Spring Boot启动过程中Netty异步架构的工作原理与应用
    深入解析Spring Boot启动过程中Netty异步架构的工作原理与应用 ... [详细]
  • Windows环境下详细教程:如何搭建Git服务
    Windows环境下详细教程:如何搭建Git服务 ... [详细]
  • 本文探讨了如何在PHP与MySQL环境中实现高效的分页查询,包括基本的分页实现、性能优化技巧以及高级的分页策略。 ... [详细]
  • 本文详细介绍了Oracle 11g中的创建表空间的方法,以及如何设置客户端和服务端的基本配置,包括用户管理、环境变量配置等。 ... [详细]
  • 在Java开发中,保护代码安全是一个重要的课题。由于Java字节码容易被反编译,因此使用代码混淆工具如ProGuard变得尤为重要。本文将详细介绍如何使用ProGuard进行代码混淆,以及其基本原理和常见问题。 ... [详细]
  • 电商高并发解决方案详解
    本文以京东为例,详细探讨了电商中常见的高并发解决方案,包括多级缓存和Nginx限流技术,旨在帮助读者更好地理解和应用这些技术。 ... [详细]
  • 本文详细介绍了在 CentOS 7 系统中配置 fstab 文件以实现开机自动挂载 NFS 共享目录的方法,并解决了常见的配置失败问题。 ... [详细]
  • Hyperledger Fabric 1.4 节点 SDK 快速入门指南
    本文将详细介绍如何利用 Hyperledger Fabric 1.4 的 Node.js SDK 开发应用程序。通过最新版本的 Fabric Node.js SDK,开发者可以更高效地构建和部署基于区块链的应用,实现数据的安全共享和交易处理。文章将涵盖环境配置、SDK 安装、示例代码以及常见问题的解决方法,帮助读者快速上手并掌握核心功能。 ... [详细]
  • 在JavaWeb项目架构中,NFS(网络文件系统)的实现与优化是关键环节。NFS允许不同主机系统通过局域网共享文件和目录,提高资源利用率和数据访问效率。本文详细探讨了NFS在JavaWeb项目中的应用,包括配置、性能优化及常见问题的解决方案,旨在为开发者提供实用的技术参考。 ... [详细]
author-avatar
nikechen
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有