0

要求:一个 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 来设计服务器?

4

1 回答 1

1

由于您在一个线程中对数据包进行排队,但在另一个线程中进行处理,因此它们的工作速率可能略有不同。我会使用线程安全队列(查看 concurrencykit.org)并在异步回调中处理整个队列,而不是只处理单个数据包。

于 2015-01-09T09:48:03.207 回答