c++ - BOOST ASIO multi-io_service RPC框架设计RFC

标签 c++ boost-asio rpc system-design

我正在开发一个 RPC 框架,我想使用多 io_service 设计来将执行 IO(前端)的 io_objects 与执行 RPC 工作的线程(前端)分离后端)。

前端应该是单线程的,后端应该有线程池。我正在考虑使用条件变量使前端和后端同步的设计。但是,似乎 boost::threadboost::asio 不混合——即,似乎条件变量 async_wait 支持不可用.我有一个关于此事的问题 here .

我想到 io_service::post() 可能用于同步两个 io_service 对象。我在下面附上了一张图,我只是想知道我是否正确理解了 post 机制,以及这是一个明智的实现。

rpc system implementation

最佳答案

我假设您使用“a single io_service and a thread pool calling io_service::run()

我还假设您的前端是单线程的,只是为了避免从多个线程写入同一个套接字的竞争条件。

可以使用 io_service::strand 实现相同的目标( tutorial )。您的前端可以通过 io_service::strand 进行 MT 同步。所有从后端到前端的post(以及从前端到前端的处理程序,如handle_connect 等)都应该被strand,像这样:

后端 -> 前端:

io_service.post(front_end.strand.wrap(
    boost::bind(&Front_end::send_response, front_end_ptr)));

或前端 -> 前端:

socket.async_connect(endpoint, strand.wrap(
    boost::bind(&Front_end::handle_connect, shared_from_this(), 
    boost::asio::placeholders::error)));

并且从前端到后端的所有帖子都不应该被 strand 包裹。

关于c++ - BOOST ASIO multi-io_service RPC框架设计RFC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6776779/

相关文章:

c++ - 为什么我们在 Boost.ASIO 中需要很多接受器?

c++ - asio::buffer_cast 奇怪的输出

c++ - 为什么 C++ 编译器(VS2013)选择了错误的函数?

java - 序列化 Integer 对象的大规模处理

C++链表打印错误

c++ - 在 x64 上获取真正的 C++ 异常

c++ - boost socket读写函数线程安全吗?

java - 生成动态文件并在 GWT 中下载

java - golang jsonrpc调用java json rpc

python - 用于 Python 的 RPC 库