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

标签 c++ messaging rpc apache-kafka capnproto

我有一个处理 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/

相关文章:

java - 如何在 Hadoop 中共享全局序列号生成器?

c++ - 什么是 undefined reference /未解析的外部符号错误,我该如何解决?

GWT 同步代理测试

c++ - 我如何在单独的头文件中的结构中定义一个 char* 数组?

grails - 如何使用RabbitMQ插件和Grails发送和接收域对象

c++ - 我的缓冲区包含元素,但未被打印

javascript - FCM 默认 onMessage 覆盖?

c++ - Apache thrift 未定义对 apache::thrift::server::TNonblockingServer 的引用

c++ - 对象的排序 vector 不起作用

c++ - 检查用户是否向 int var 输入了一个 float ?