我有多个守护进程(一个网关和多个服务,都在同一个节点上运行),其中一些服务守护进程需要对网络上到达的请求进行“软实时”响应,我的arch就像我有一个网关守护进程,它根据某个协议标签将传入的数据包路由到相应的服务守护进程。服务守护进程处理请求并将响应发送回gw守护进程,gw守护进程上线。一切都很好,正在工作,但我没有达到“软实时”,看到了滞后。
我计划在下面的方式上即兴发挥,在网关和服务守护进程之间共享网络连接,我将有一个通知方案,通过该方案,当数据包到达连接时,gw守护进程将数据包从套接字队列中出列,查看协议头,并“通知”相应的服务守护进程“数据已到达”,在接收到通知时,服务守护进程将获取二进制信号量,并将数据从套接字队列中出列。将有两个这样的信号量,一个用于写入,另一个用于读取。当服务守护进程需要发送数据时,它会获取写信号量并发送数据。当它接收到来自网关守护进程的“数据到达”通知时,它会抓取读取信号量,并将数据从套接字中取出。对于每个新的连接请求,网关守护程序将使用"sendmsg“将连接发送到服务守护程序。
有没有人曾经尝试过这个计划?您认为这种方法有什么问题吗?请提出意见/建议。
发布于 2012-06-28 20:45:20
如果您想避免复制开销,您可能应该使用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);
}https://stackoverflow.com/questions/11209047
复制相似问题