0

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

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

4

1 回答 1

2

不幸的是,这并不是那么简单。是的,它们都使用 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!:)

于 2015-10-15T03:05:47.760 回答