【问题标题】:what is a good way to integrate 3rd party asynchronous APIs with Cap'n Proto RPC?将 3rd 方异步 API 与 Cap'n Proto RPC 集成的好方法是什么?
【发布时间】:2015-10-15 11:05:47
【问题描述】:

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

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

【问题讨论】:

    标签: c++ messaging rpc apache-kafka capnproto


    【解决方案1】:

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

    【讨论】:

    • 感谢肯顿。我查看了节点实现,但有点谨慎,因为它在混合中添加了 libuv,它被认为很慢而且有点笨拙。我很想将 Kafka 位移动到与 KJ 接口链接的新库中。如果 RPC 管道也可以通过零拷贝访问新功能,那就太好了,但我不确定这有多难。这听起来可行吗?我处于早期创业阶段,所以在我们获得一些投资者之前我们可能无法开源:)。
    • librdkafka 提供了一个非阻塞的异步接口,所有的 IO 操作都是在后台线程中执行的,所以你只要依靠 Cap'n 的事件调度器作为你的主循环就可以了。
    • @JamesFremen 我指出了 libuv 实现作为如何将 KJ 与外部事件循环集成的示例。我不知道 KJ-UV 胶水代码中有任何性能问题或其他主要问题。它完全是零拷贝。除非Kafka的低级事件接口很糟糕,否则你应该可以通过这种方式与它集成就好了。
    • @Edenhill 即使有一个后台线程在执行 I/O(这听起来令人惊讶),它可能也需要某种方式将事件传递到主线程,这需要某种事件循环集成.
    • @Edenhill 感谢您的回复。我正在寻找单线程实现,因为我认为它可以为我的工作负载提供更细粒度的资源分配和足够的性能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-06
    • 1970-01-01
    • 2016-03-05
    • 1970-01-01
    相关资源
    最近更新 更多