我有一台处理Cap'n Proto RPC请求的Linux服务器。其中一些请求需要将请求中的数据转发到另一个运行的服务器,在本例中是一个Kafka代理。 librdkafka和Cap'n Proto KJ库都可以使用poll(),所以我认为操作系统将确保它们都可以异步运行,但我不确定是否需要进一步的集成或有益。有没有人有这方面的经验?
这个问题比我列出的具体内容有点广泛..我将来可能会从Cap'n Proto RPC中调用其他API,因此任何广泛的指导方针都将受到赞赏。
答案 0 :(得分: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&#prot; prot! :)