要求:一个 UDP 服务器,它在接收到 UDP 数据包并将接收到的数据包存储到两个队列之一。工作线程与每个队列相关联,相关线程从队列的前面提取数据包,对其进行处理并将其写入内存缓存系统。
约束:解决方案必须基于事件循环(libuv)并用 C 编写
我的解决方案
为传入的 UDP 注册一个回调,它将接收到的数据包添加到两个队列之一并引发 uv_async_send
为每个队列创建两个全局 uv_sync_t 对象,并用作 uv_async_send 的参数。例如:如果数据包被添加到 queue-one,那么 uv_sync_t object-1 被用作 uv_async_send 的参数。类似地,如果将数据包添加到队列 2,则使用 uv_sync_t 对象 2
启动了两个线程,每个线程都有自己的循环和与回调绑定的句柄
- 在线程一个 uv_sync_t object-1 绑定到一个函数(比如 funcA)。在线程二 uv_sync_t object-2 绑定到另一个函数(比如 funcB)
- funcA 和 funcB 从相应队列中读取“SINGLE”数据包并将其存储在内存缓存中
问题 客户端发送大量数据包,在服务器中注册大量事件。现在的问题是 libuv 将多个调用合并为一个并调用单个回调(从队列中删除一个 SINGLE 节点)。这会导致节点以更快的速度添加到队列中并以非常慢的速度移除。这些费率可以平衡吗?
有没有更好的方法来使用事件循环库 libuv 来设计服务器?