C++ 将第三方异步API与Cap'集成的好方法是什么;n Proto-RPC?

C++ 将第三方异步API与Cap'集成的好方法是什么;n Proto-RPC?,c++,messaging,rpc,apache-kafka,capnproto,C++,Messaging,Rpc,Apache Kafka,Capnproto,我有一个Linux服务器,它处理Cap'n Proto RPC请求。其中一些请求需要将请求中的数据转发到另一台运行Kafka代理的服务器。librdkafka和Cap'n Proto-KJ库都可以使用poll(),因此我认为操作系统将确保它们都可以异步运行,但我不确定是否需要进一步集成或是否有益。有人有这方面的经验吗 这个问题比我列出的细节要宽泛一些。。将来我可能会从Cap'n Proto RPC调用其他API,因此任何广泛的指导原则都将受到欢迎。不幸的是,这并不是那么简单。是的,它们都使用po

我有一个Linux服务器,它处理Cap'n Proto RPC请求。其中一些请求需要将请求中的数据转发到另一台运行Kafka代理的服务器。librdkafka和Cap'n Proto-KJ库都可以使用poll(),因此我认为操作系统将确保它们都可以异步运行,但我不确定是否需要进一步集成或是否有益。有人有这方面的经验吗


这个问题比我列出的细节要宽泛一些。。将来我可能会从Cap'n Proto RPC调用其他API,因此任何广泛的指导原则都将受到欢迎。

不幸的是,这并不是那么简单。是的,它们都使用poll(),但问题是,一次只有一个库调用poll(),并且只有该库实际接收任何事件——另一个被卡住了。对于事件循环库来说,这是一个典型的挑战——默认情况下,它们不能一起使用

一种选择是尝试在单独的线程中使用这些库。但是,事件驱动库的设计通常基于这样的假设,即您在一个线程中完成所有工作,否则为什么需要事件循环

但是“正确的事情”是集成事件循环。KJ的事件循环能够与其他事件库集成。例如,我为节点capnp将其与libuv集成;请参阅此文件的第一部分:

(在某种程度上,我计划将libuv相关代码分离到Cap'n Proto附带的单独库中。)

再举一个例子,Nathan Hourt提出了一个pull请求,要求添加与Qt事件循环的集成——但请注意,这个请求不包括I/O集成,我认为这是因为Nathan使用的是
AsyncIoStream
的实现,当数据可用时,他会手动将数据推送到其中:


在任何情况下,无论卡夫卡使用什么,你都需要做类似的事情。希望您能将代码贡献回Cap'n Proto!:)

谢谢你,肯顿。我查看了节点实现,但有点谨慎,因为它将libuv添加到混合中,并且被认为是缓慢且有点笨拙的。我很想把卡夫卡的部分移到一个新的库中,这个库与KJ的接口相链接。如果RPC管道也可以使用零拷贝访问新功能,那就太好了,但我不确定这有多困难。你觉得这可行吗?我正处于初创阶段,所以在得到一些投资者之前,我们可能无法开放源代码:)。librdkafka提供了一个非阻塞异步接口,所有IO操作都在后台线程中执行,因此,只需依赖Cap'n的事件调度器作为主循环就可以了。@jamesfremeni将libuv实现作为如何将KJ与外部事件循环集成的示例。我不知道KJ-UV胶水代码中有任何性能问题或其他主要问题。完全是零拷贝。除非Kafka的低级事件接口非常糟糕,否则您应该能够以这种方式与它进行集成。@Edenhill即使有一个后台线程执行I/O(听起来很奇怪),它也可能需要某种方式将事件传递到主线程,这需要某种事件循环集成。@Edenhill感谢您的响应。我正在寻找单线程实现,因为我认为它可以为我的工作负载提供更细粒度的资源分配和足够的性能。