我有多个守护进程(一个网关和多个服务,都在同一个节点上运行),其中一些服务守护进程需要“软实时”响应网络上到达的请求,我的拱门就像我有一个网关守护进程,它根据一些协议(protocol)标签将传入的数据包路由到相应的服务守护进程。服务守护进程处理请求并将响应发送回连接到网络的 gw 守护进程。一切正常,工作正常,但我没有实现“软实时”并看到滞后。
我计划通过以下方式即兴创作,在网关和服务守护进程之间共享网络连接,我将有一个通知方案,当数据包到达连接时 gw 守护进程不会将数据包取消排队从套接字队列查看协议(protocol) header 并“通知”相应的服务守护程序“数据已到达”,服务守护程序收到通知后获取二进制信号量并将数据从套接字队列中取出。将有 2 个这样的信号量,一个用于写入,另一个用于读取。当服务守护进程需要发送数据时,它会获取写信号量并发送数据。当它从网关守护程序接收到“数据到达”通知时,它会获取读取的信号量并将数据从套接字中取出。在每个新的连接请求上,网关守护进程将使用“sendmsg”将连接发送到服务守护进程。
有没有人尝试过这个方案?你认为这种方法有什么问题吗?请发表评论/建议。
最佳答案
如果你想避免复制开销,你应该使用 splice
,而不是试图在多个守护进程之间共享套接字。该解决方案将极其难以调试和维护。
我期望(并希望)您的网络协议(protocol)有一个 header ,它使网关很容易知道将数据包路由到哪里,然后是用于服务守护程序的有效负载。
网关在伪代码中这样做:
while (data on socket)
{
header = read(socket, sizeof(header));
service_socket = find_service(header);
splice(socket, NULL, service_socket, NULL, header->payload_length, 0);
}
关于linux - 在 Linux 上的进程之间共享套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11209047/