我有一个处理 Cap'n Proto RPC 请求的 Linux 服务器。其中一些请求需要将请求中的数据转发到另一台正在运行的服务器,在本例中是 Kafka 代理。 librdkafka 和 Cap'n Proto KJ 库都可以使用 poll(),所以我认为操作系统将确保它们都可以异步运行,但我不确定是否需要进一步集成或是否有益。有没有人有这方面的经验?
这个问题比我列出的细节要宽泛一些。我将来可能会从 Cap'n Proto RPC 调用其他 API,因此我们将不胜感激。
最佳答案
不幸的是,这并不是那么简单。是的,它们都使用 poll(),但问题是,一次只有一个库会调用 poll(),并且只有那个库会实际接收任何事件——另一个被卡住了。这是事件循环库的经典挑战——默认情况下它们不能一起使用。
一种选择是尝试在单独的线程中使用这些库。但是,事件驱动库通常围绕这样的假设进行设计:您在单个线程中执行所有操作,否则为什么需要事件循环?
但是“正确的事情”是集成事件循环。 KJ 的事件循环能够与其他事件库集成。例如,我将其与 libuv 集成用于 node-capnp;查看此文件的第一部分:
https://github.com/kentonv/node-capnp/blob/master/src/node-capnp/capnp.cc
(在某些时候,我计划将此处与 libuv 相关的代码分离到一个单独的库中,随 Cap'n Proto 一起提供。)
再举一个例子,这是 Nathan Hourt 提出的添加与 Qt 事件循环集成的拉取请求——但请注意,这个请求不包括 I/O 集成,我认为是因为 Nathan 正在使用 AsyncIoStream 的实现
当数据可用时,他手动将数据推送到其中:
https://github.com/sandstorm-io/capnproto/pull/253
无论如何,无论 Kafka 使用什么,您都需要做一些类似的事情。希望您随后将您的代码贡献回 Cap'n Proto! :)
关于c++ - 将 3rd 方异步 API 与 Cap'n Proto RPC 集成的好方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33131595/