与选择驱动的守护进程一起使用的 rpc 机制
Posted
技术标签:
【中文标题】与选择驱动的守护进程一起使用的 rpc 机制【英文标题】:rpc mechanism to use with select driven daemon 【发布时间】:2012-07-28 11:46:45 【问题描述】:我想将 RPC 服务添加到我的 unix 守护程序。守护进程是用 C 语言编写的,并且有一个使用 select() 实现的事件驱动循环。我查看了许多 RPC 实现,但它们似乎都涉及调用库例程或自动生成的代码,它们会无限期地阻塞。
是否有任何 RPC 框架,其中库代码/自动生成的代码不会阻塞或启动线程。理想情况下,我想自己创建输入/输出套接字并将它们传递到我的选择循环中。
问候,
Alex - 第一次海报! :-)
【问题讨论】:
【参考方案1】:我假设你可以使用 C++ Apache Thrift 很好 - FAST RPC 也很有用。
我在 2012 年初评估了相当多的库,最终选择了 ZeroMQ,因为它更具适应性并且(我发现它)更容易且更灵活。我确实考虑过使用Google protobuf 实现,但最终使用了更简单的结构化命令文本方法。
我可能不会考虑在 C 中这样做,除非我必须这样做,在这种情况下,我可能会从标准的 rpc(3) 东西开始,为了更好的概述,请参阅 overview of Remote Procedure Calls (RPC)。
【讨论】:
看起来 Thrift 需要调用 server.serve(),而 rpc(3) 需要调用 svc_run()。这两个块。根据我对 zeromq 的记忆,它也需要调用阻塞函数(并且它会创建大量线程!)所有这些都要求我放弃我的守护进程中的选择驱动架构,该架构到目前为止一直运行良好。 FastRPC 似乎仅限于本地 - 这排除了这一点。虽然我更喜欢基于文本和自我描述的东西,但 Google 协议缓冲区可能会起作用。 @alex 在这种情况下,我想我会基于事件与调度程序/解析器构建自己的机制。我可能会从基于我的 emesary C++ 类库的东西开始 感谢早期关于 google 协议缓冲区的指针。我现在已经使用它们作为编组器构建了一些东西,但是我需要编写自己的代码来处理输入和输出而不会阻塞。不为此重用现有代码似乎是错误的,但我发现的所有内容都需要调用阻塞代码,这会破坏我的事件驱动架构。以上是关于与选择驱动的守护进程一起使用的 rpc 机制的主要内容,如果未能解决你的问题,请参考以下文章
python—day29 守护进程互斥锁模拟抢票IPC通信机制生产者消费者模型
开启子进程的两种方式,孤儿进程与僵尸进程,守护进程,互斥锁,IPC机制,生产者与消费者模型