【问题标题】:Process a single connection with multiple threads处理具有多个线程的单个连接
【发布时间】:2014-11-10 07:05:08
【问题描述】:

我有 3 个异步服务器和客户端相互连接,就像一条链。

一个请求通过3个系统像

=> System 1 => System 2 => System 3 =>

还有回应

=> System 3 => System 2 => System 1 =>

我在每个系统中都有一个逻辑,以便将响应与正确的请求结合起来。通过这种逻辑,我设法以不同的顺序处理响应和请求。

今天,我在系统之间只有一个连接。而且我注意到只使用了一个线程,并且性能不好...... :(

是否有任何配置可以强制每个连接使用多个线程? 这是解决这个问题的正确方法吗?或者我必须在每个系统之间建立一个连接池?,netty 有这种池还是我必须自己实现它?

我正在使用 netty 5。

非常感谢。

【问题讨论】:

    标签: netty


    【解决方案1】:

    请参阅Netty wikis 以获得对线程模型的一般描述。总之,Netty 4.0+ 不会在通道处理操作中引入并发。查看netty examples 的大部分内容,您会注意到因此缺乏同步。同时操作通道会给框架和与框架交互的接口带来更多复杂性。

    我认为问题是您的用例是否支持在多个渠道中拆分?这取决于很多因素,但如果您的算法和数据支持并行化,那么您可能会看到整体吞吐量有所提高。

    Netty 确实提供了 ChannelGroup,但我不确定这是否适合您的用例。

    【讨论】:

    • 感谢您的回复。问题之一是:如果 netty 假设以这种方式工作。在仔细阅读文档和您的评论后,我认为答案是肯定的。第二个问题是:如果我们假设我的数据和用例允许建立多个连接,我应该创建多个连接(全部异步)还是只建立一个?我继续说,netty 通过多个连接很好地利用了 CPU 及其内核,而只有一个连接并没有太多?
    • 您正确地解释了这个答案。 1) Netty 单通道无并发。 2) Netty 旨在处理许多渠道。您的应用程序必须提供如何使用所有这些通道的设计和实现。池化是一种选择。 Object poolingconnection pooling 本身就是一种模式,您可以阅读它们何时/为什么有益(或问另一个问题:))。
    • 虽然已经有一段时间了,但我发现这个问题与我有一个服务器有一个或几个客户端的要求非常相关,但是这些客户端会产生大量流量。是否可以将多线程EventExecutor 用于管道中的通道处理程序,以便通过EventExecutor 线程池而不是通道EventLoop 实现并发?它会确保来自客户端的一条消息将由一个线程通过所有处理程序处理,而下一条消息由另一个线程处理?有没有可用的示例源?
    猜你喜欢
    • 1970-01-01
    • 2020-01-06
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多