将 3rd 方异步 API 与 Cap'n Proto RPC 集成的好方法是什么?

what is a good way to integrate 3rd party asynchronous APIs with Cap'n Proto RPC?

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

这个问题比我列出的细节要宽泛一些。我将来可能会从 Cap'n Proto RPC 调用其他 API,因此我们将不胜感激。

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

一种选择是尝试在单独的线程中使用这些库。但是,事件驱动库通常围绕这样的假设进行设计,即您在单个线程中执行所有操作,否则为什么需要事件循环?

但是"The Right Thing"是为了整合事件循环。 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! :)