我正在尝试构建基于libuv的应用程序的主要事件处理。该应用程序由一个(或多个)共享套接字的UDP接收器组成,其作用是将处理传入消息委托给公共工作池。
由于处理的协议是有状态的,所有来自任何给定服务器的数据包应始终指向同一个工作程序 - 这种约束似乎使得无法使用LibUV内置工作池。
工人应该能够自己发送数据包。
因此,作为LibUV的新手,我想与您分享预期的架构,以获得有关它的反馈和最佳实践。
- 每个工作人员都运行自己的LibUV循环,允许他们通过网络直接发送数据包。此外,每个工作人员都有一个专用的并发队列来发送消息。
- 收到数据包时,会对其源地址进行哈希处理,以便从池中选择相应的工作程序。
- 接收器在接收器循环上创建了一个唯一的异步句柄,在处理完成时充当回调。
- 接收方通过异步句柄通知工作人员,新消息可用,唤醒工作人员,开始处理所有排队的消息。
- 工作线程调用接收器队列上的异步句柄,这将导致接收器将缓冲区返回到池并释放所有分配的资源(因此,池不需要是线程安全的)。
我的主要问题是:
- 为每个收到的消息创建异步句柄的开销是多少?这是一个好的设计吗?
- 是否有任何内置方式将消息发送到另一个事件循环?
- 使用另一个循环发送传出数据包,而不是直接从工作循环中执行它会更好吗?
感谢。