0

我有多个守护进程(一个网关和多个服务,都在同一个节点上运行),其中一些服务守护进程需要“软实时”响应网络上到达的请求,我的拱门就像我有一个网关守护进程,它根据一些协议标签将传入的数据包路由到相应的服务守护进程。服务守护进程处理请求并将响应发送回连接到网络的 gw 守护进程。一切都很好,但我没有达到“软实时”并看到滞后。

我计划以下面的方式即兴创作,在网关和服务守护进程之间共享网络连接,我将有一个通知方案,当数据包到达连接时,gw 守护进程不会从套接字中取出数据包queue 查看协议头并“通知”相应的服务守护程序“数据已到达”,服务守护程序在接收到通知时获取二进制信号量并将数据从套接字队列中取出。将有 2 个这样的信号量,一个用于写入,另一个用于读取。当服务守护进程需要发送数据时,它会抓取写入信号量并发送数据。当它收到来自网关守护进程的“数据到达”通知时,它会抓取读取的信号量并将数据从套接字中取出。

有没有人尝试过这个方案?你觉得这种方法有什么问题吗?请评论/建议。

4

1 回答 1

1

如果您想避免复制开销,您可能应该使用splice,而不是尝试在多个守护程序之间共享套接字。该解决方案将非常难以调试和维护。

我希望(并希望)您的网络协议有一个标头,它可以让网关轻松知道将数据包路由到哪里,然后是一个用于服务守护程序的有效负载。

在伪代码中,网关执行以下操作:

while (data on socket)
{
    header = read(socket, sizeof(header));

    service_socket = find_service(header);
    splice(socket, NULL, service_socket, NULL, header->payload_length, 0);
}
于 2012-06-28T12:45:20.303 回答