【问题标题】:C/C++/Haskell AMQP server libraryC/C++/Haskell AMQP 服务器库
【发布时间】:2014-04-25 04:36:40
【问题描述】:

是否有任何已知的可用作库的 AMQP 代理实现?有大量的客户端,但我发现的代理实现都希望作为独立进程运行。

我正在考虑编写一些东西,其中每个节点既是代理又是客户端。不能选择独立的代理/外部流程。

最好使用 C/C++ 或 Haskell 或任何提供可链接的类 C 接口的东西。

如果没有,是否有任何推荐的 AMQP 替代方案符合要求?

【问题讨论】:

    标签: c++ c haskell amqp


    【解决方案1】:

    试试ZerroMQ (ØMQ)。

    这里是client and server example 手册。

    以及来自示例仓库的简要实现:

    Server:

    // Hello World server
    
    #include <zmq.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <string.h>
    #include <assert.h>
    
    int main (void)
    {
        // Socket to talk to clients
        void *context = zmq_ctx_new ();
        void *responder = zmq_socket (context, ZMQ_REP);
        int rc = zmq_bind (responder, "tcp://*:5555");
        assert (rc == 0);
    
        while (1) {
            char buffer [10];
            zmq_recv (responder, buffer, 10, 0);
            printf ("Received Hello\n");
            sleep (1); // Do some 'work'
            zmq_send (responder, "World", 5, 0);
        }
        return 0;
    }
    

    Client:

    // Hello World client
    #include <zmq.h>
    #include <string.h>
    #include <stdio.h>
    #include <unistd.h>
    
    int main (void)
    {
        printf ("Connecting to hello world server...\n");
        void *context = zmq_ctx_new ();
        void *requester = zmq_socket (context, ZMQ_REQ);
        zmq_connect (requester, "tcp://localhost:5555");
    
        int request_nbr;
        for (request_nbr = 0; request_nbr != 10; request_nbr++) {
            char buffer [10];
            printf ("Sending Hello %d...\n", request_nbr);
            zmq_send (requester, "Hello", 5, 0);
            zmq_recv (requester, buffer, 10, 0);
            printf ("Received World %d\n", request_nbr);
        }
        zmq_close (requester);
        zmq_ctx_destroy (context);
        return 0;
    }
    

    【讨论】:

    • 我应该提到这一点。我知道并且已经在使用 ZMQ,但它没有提供像 AMQP 那样的保证,而且我们在丢失数据方面遇到了问题,这排除了它作为一种选择,但它实际上是我正在考虑的那种库。跨度>
    • 使用 AMQP 代理,您也可能会丢失数据(这种情况非常罕见,我们在最新的 RabbitMQ 中不再遇到此类问题)。运行 amqp 代理守护程序有什么问题?
    • 外部进程意味着要管理和维护的其他东西,但更重要的是,应用程序可以在运行时根据许多因素在无需人工参与的情况下进行更改,外部代理不提供细粒度控制必填
    • RabbitMQ 可以从客户端进行配置(与其他代理不同)。您可以在运行时添加、删除交换、队列、更改绑定,而无需触及代理配置、重启等。
    • 我同意,你几乎不需要接触配置文件,一切都可以通过 API 完成。您拥有完全的控制权。
    【解决方案2】:

    在四处询问后,我被指出 Nanomsg 由 Martin Sústrik 完成,与 ZMQ 相同的家伙。虽然它并不能完全提供我所追求的保证,但似乎从 ZMQ 对 nanomsg 所做的架构更改使得手动实现和执行保证变得更加容易。 我会更深入地研究它,但到目前为止它看起来很有希望。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-22
      • 2017-06-14
      • 1970-01-01
      • 2010-09-28
      相关资源
      最近更新 更多