java - 分布式处理的最大吞吐量(使用netty 4.0)

标签 java io netty distributed-computing system-design

我们构建分布式处理系统,并希望使用 netty (4.0) 作为网络 I/O 堆栈。

以下情况:我们有一个生产者任务 A 和一个消费者任务 B。任务 A 生成 64K block 的数据并将其传输到任务 B。任务 B 在某些情况下可能是计算密集型的,并且消耗 64K block 的速度比任务 A 生成的速度慢。任务 A 和 B 通过 tcp channel 连接。

我们考虑这种方法:任务 A 生成 block 并将其放入本地队列中。当 tcp channel 空闲并且下一个 64K 可以写入 channel 时,会自动从队列中取出一个 block (netty 给我们这样的信号/事件吗?)。如果任务 A 上的队列超出了存储 block 的固定限制,我们将阻止任务 A 直到任务 B 消耗完 block 。本质上,我们希望任务 A 能够“接收器触发写入”,以充分利用 tcp channel 而不造成拥塞。此设计的目标应该是最大数据吞吐量。

现在有几个问题:)

这是实现最大吞吐量的良好设计吗?充分利用 tcp channel 的更好设计是什么?

netty 是适合这些场景的框架吗? (我对 Netty 还很陌生,但我真的很喜欢这个框架干净的抽象/设计!)

这样的设计用netty能实现吗? =>(它是否从接收器站点向我们提供了这样的信号/事件?)

使用 Netty 实现最大吞吐量的最佳设计是什么?

还有其他更合适的框架吗?

欢迎任何想法和注释!

非常感谢! 托比

最佳答案

这里有几点说明:

  • 一般设计:您提到了“分布式”处理,但没有指定是否有任务 A 和任务 B 处理器的多个实例。如果您只有一个任务 A 处理器和一个任务 B 处理器,则数据吞吐量将由较慢的处理器决定。我知道,平均而言,B 较慢,但它可以更快,因此在 A 和 B 之间引入缓冲区看起来是个好主意。因此,我认为如果您想要/需要坚持使用单个 A 和单个 B 实例,那么设计就很好,但是如果 B 确实较慢,您可能会考虑使用多个实例(然后您将拥有比 A 更多的 B 实例)

  • netty 或其他框架:是的,您可以在 Netty 中做到这一点。但是,我认为您必须编写“TCP channel 空闲”信号。我没有太多经验,但我认为像 http://akka.io/ 这样的框架,实现消息传递和参与者模型将会很有趣。

关于java - 分布式处理的最大吞吐量(使用netty 4.0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20483364/

相关文章:

java - 关闭连接导致流关闭错误

mysql - 我使用多进程向MySQL插入数据有什么意义吗?

java - 与代理服务器一起使用时大型请求正文的 Netty 握手超时

java - Spring MVC RESTful 多 View - 404 未找到

java - 确定 Java 赛车程序的获胜者

java - 使用包依赖项从命令行创建 .class 文件

c - 如果我打算通过多个进程访问文件的多个部分,使用 CreateFileMapping 和 MapViewOfFile 的正确方法是什么?

java - Netty4 混淆与简单示例

netty - 如何提高服务器 SSL 性能

java - 如何使用 selenium 工具测试我们的 chrome 扩展?