【问题标题】:Can we use inproc transport along with pub/sub messaging pattern in gRPC?我们可以在 gRPC 中使用 inproc 传输和 pub/sub 消息传递模式吗?
【发布时间】:2020-10-05 17:59:46
【问题描述】:

基本上,我正在探索将 gRPC 用于事件驱动机制,用于在应用程序的同一进程(但不同线程)内的发布者和多个订阅者之间交换信息。该应用程序是 C++ 应用程序。

不幸的是,我看到的所有 gRPC pubsub 示例都使用了我不需要的 Google 云,因为我的要求是在进程中和本地化的。 我看到 ZeroMQ (ZeroMQ, can we use inproc: transport along with pub/sub messaging pattern) 的类似问题,并看到在 ZeroMQ 中可以这样做。

问题:
在不使用 Google 云的情况下,使用 gRPC 进行进程内发布/订阅是否可行?
有任何示例吗?
或者我应该根据自己的要求切换到 ZeroMQ 吗?

【问题讨论】:

    标签: grpc zeromq publish-subscribe


    【解决方案1】:

    Q“或者我应该根据自己的要求切换到 ZeroMQ 吗?”

    与前两个相比,最后一个问题对我来说似乎是可以决定的。让我们试试吧:

    人们可以选择使用更年轻、轻量级的 或成熟的、更多的互操作协议,尽管只给出了 inproc://-transport-提到了类,后者似乎已经为这项任务做好了准备。

    如果只需要这个传输类,可以使用显式请求将数据泵实例化为纯 I/O-thread-less Context()-instances:

    #define Zero_IO_threads 0
    
    void    *myCtx =                zmq_ctx_new ( Zero_IO_threads );
    assert ( myCtx      && "FAILED: zmq_ctx_new ( ... )" );
                                    zmq_ctx_set ( myCtx, ZMQ_BLOCKY, false );
    
    void    *aPubSocket =           zmq_socket ( myCtx, ZMQ_PUB );
    assert ( aPubSocket && "FAILED: zmq_socket ( ... )" );
    ...
    
    void    *aSubSocket =           zmq_socket ( myCtx, ZMQ_SUB );
    assert ( aSubSocket && "FAILED: zmq_socket ( ... )" );
             rc =                   zmq_setsockopt ( aSubSocket, ZMQ_SUBSCRIBE, "", 0 );
    assert ( rc == 0    && "FAILED: zmq_setsockopt ( aSubSocket, ... )" );
    ...
    
             rc =                   zmq_bind ( aPubSocket, "inproc://#A" ); // Def inproc name "#A"
    assert ( rc == 0    && "FAILED: zmq_bind ( aPubSocket, ... )" );
    
    ...
             rc =                   zmq_connect ( aSubSocket, "inproc://#A"); // Try connect to #A
    assert ( rc == 0    && "FAILED: zmq_connect ( aSubSocket, ... )" );
    
    // ___________________________________________aSubSocket can start receive messages
    ...
    
    // ___________________________________________FINALLY: gracefully close & terminate
    assert ( 0 == zmq_close ( aPubSocket ) && "FAILED: zmq_close( aPubSocket )" );
    ...
    assert ( 0 == zmq_close ( aSubSocket ) && "FAILED: zmq_close( aSubSocket )" );    
    ...
    assert ( 0 == zmq_ctx_term ( myCtx )   && "FAILED: zmq_ctx_term( myCtx )" );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-22
      • 2021-09-28
      • 1970-01-01
      • 2013-06-20
      • 2012-01-05
      • 1970-01-01
      • 2023-02-01
      • 1970-01-01
      相关资源
      最近更新 更多