RabbitMQ集成开发相关
------------恢复内容开始------------
关键字:交换器,队列,消息,绑定
一、RabbitMq服务端及安装,参考服务端Windows安装链接。
1. 安装erlang环境
下载路径:https://www.erlang.org/downloads
2. 安装RabbitMq及配置
网络上资料较多,直接查询即可,后续将注意事项列出并总结。
二、客户端及开发,参考RabbitMQ官网客户端开发相关。
1. RabbitMQ C client
Introduction
This is a C-language AMQP client library for use with v2.0+ of the RabbitMQ broker.
Announcements regarding the library are periodically made on the rabbitmq-c-users and cross-posted to rabbitmq-users.
- https://groups.google.com/forum/#!forum/rabbitmq-c-users
- https://groups.google.com/forum/#!forum/rabbitmq-users
Latest Stable Version
The latest stable release of rabbitmq-c can be found at:
Documentation
API documentation for v0.8.0+ can viewed from:
http://alanxz.github.io/rabbitmq-c/docs/0.8.0/
2. SimpleAmqpClient,a C++ wrapper around rabbitmq-c
SimpleAmqpClient is an easy-to-use C++ wrapper around the rabbitmq-c C library. It derives inspiration from the puka AMQP library in that it abstracts away the underlying AMQP wire concept of channels and uses them as an error/consumer scope. This should make writing simple single-threaded AMQP-enabled apps easy.
Installing
Known to work in the following environments:
- Windows 7 (MSVC 10, Win64, Win32). Likely to work in others, but has not been tested
- Linux (RHEL 6.0, GCC-4.4.5, 32 and 64 bit). Likely to work on other configurations, but has not been tested
- Mac OS X (10.7, 10.6, gcc-4.2, 32 and 64-bit). Likely to work on older version, but has not been tested
Pre-requisites
- boost-1.47.0 or newer (uses chrono, system internally in addition to other header based libraries such as sharedptr and noncopyable)
- rabbitmq-c you'll need version 0.8.0 or better.
- cmake 3.5+ what is needed for the build system
- Doxygen OPTIONAL only necessary to generate API documentation
3. amqpcpp, a C++ message library for RabbitMQ
Rabbitcpp is a C++ library for Message Queue Server RabbitMQ (http://www.rabbitmq.com/) and support the AMQP (Advanced Message Queuing Protocol http://en.wikipedia.org/wiki/Advanced_Message_Queuing_Protocol ). The C++ library is using the C-rabbitmq client library (https://github.com/alanxz/rabbitmq-c).
需要下载 RabbitMQ-C client library from https://github.com/alanxz/rabbitmq-c
4. AMQP-CPP, a C++ RabbitMQ client
参考例子:RabbitMQ入门详解及其应用。
三、开发配置及参数
基础部分参考基本概念。
1.Exchanges配置
交换器是消息送达的实体。他是具名的。注意:AMQP 1.0规范将定义可移除的交换器。 参考三种类型交换机。也可参考https://www.cloudamqp.com/blog/part4-rabbitmq-for-beginners-exchanges-routing-keys-bindings.html。
-
Fanout Exchange
不处理路由键。你只需要简单的将队列绑定到交换机上。一个发送到交换机的消息都会被转发到与该交换机绑定的所有队列上。很像子网广播,每台子网内的主机都获得了一份复制的消息。Fanout交换机转发消息是最快的。
-
Direct Exchange
处理路由键。需要将一个队列绑定到交换机上,要求该消息与一个特定的路由键完全匹配。这是一个完整的匹配。如果一个队列绑定到该交换机上要求路由键 “test”,则只有被标记为“test”的消息才被转发,不会转发test.aaa,也不会转发dog.123,只会转发test。
-
Topic Exchange
将路由键和某模式进行匹配。此时队列需要绑定要一个模式上。符号“#”匹配一个或多个词,符号“*”匹配不多不少一个词。因此“audit.#”能够匹配到“audit.irs.corporate”,但是“audit.*” 只会匹配到“audit.irs”。
passive:交换器不在事先被声明,如果其不存在将抛出错误。
durable:该交换器将在broker重启后生效。
auto-delete:该交换器将在没有消息队列绑定时自动删除。一个从未绑定任何队列的交换器不会自动删除。
argments:交换机的属性参数
2.Queues配置
队列是接收消息的实体,具有名字和属性,但没有类型。客户端可以订阅队列以便使broker递送某消息队列的内容到该客户端。另,客户端也可自动到队列取他所感兴趣的消息。
消息确保以它被送往队列时的顺序分发。但在进行某些重新路由的操作如失效处理时,其顺序则不能保证。
属性:
alternate-exchange :当消息被订阅者拒绝或者由于队列被删除而孤立时则被送往此交换器,同时队列中的该消息被删除。
passive :当队列不存在时会抛出一个错误信息,仍然不会被声明。
durable :队列将在broker重启时启动。
exclusive :队列仅服务于一个客户端。
auto-delete :队列在没有活跃订阅者的时候将自动删除。这个类似于具有auto-delete属性的交换器:如果队列上从未有活动的订阅者则不会自动删除。当客户端终结时, exclusive类型的队列则一定会自动删除。
3.Message
消息是不具名的。它被发布到交换器。它由消息头和消息体组成。消息体是不透明的,而消息头则由一系列的可选属性组成:
routing-key :该域的使用取决于交换器的类型。
immediate :如果至少一个队列可以接收,但却没有订阅者,则该消息将被当作无路由进行处理。
delivery-mode :指出该消息可能需要持久性存储。broker仅对此类消息在被消费前进行最大能力的防丢失措施。如果不能确定broker终结时消息是否投递成功则可能会发生消息被多次投递的情况。不具有这个属性的消息则不会如此。
priority :相对于其他消息的优先权,范围0至9.
expiration :消息在被broker当作不可路由处理前的存续时间,以毫秒为单位。
4.Binding
绑定是队列和交换器之间的关系,规定消息如何由交换器到队列。绑定的属性被交换器用来与路由算法匹配。绑定和交换器算法可组合形成各种情形:
Unconditional:绑定无任何属性,交换器请求所有的消息。
Conditional on a fixed string :绑定有一个属性routingkey,请求所有与此标识相符的消息。
Conditional on a pattern match :绑定有一个属性routingkey,请求所有与此标识的模式匹配的消息。可以使用通配符。AMQP实现了主题匹配模式。
Conditional on multiple fixed strings :绑定有一个属性表,请求所有与各个表项匹配的消息。各表项的条件可以是与、或。
Conditional on multiple patterns :绑定有一个属性表,请求所有与各个表项的模式匹配的消息。
Conditional on algorithmic comparison :绑定有一个算术表达式(类似SQL的SELECT WHERE语句),请求所有头部匹配此表达式的消息。
Conditional on content inspection :绑定指定通配符,请求所有消息实际内容与此条件相符的消息。
注意:这些并非全部是标准,取决于具体实现。
5.Channel
Connection和Channel之间的关系参考下图。我们知道无论是生产者还是消费者,都需要和 RabbitMQ Broker 建立连接,这个连接就是一条 TCP 连接,也就是 Connection。一旦 TCP 连接建立起来,客户端紧接着可以创建一个 AMQP 信道(Channel),每个信道都会被指派一个唯一的 ID。信道是建立在 Connection 之上的虚拟连接,RabbitMQ 处理的每条 AMQP 指令都是通过信道完成的。参考RabbitMQ 中 Connection 和 Channel 详解。

RabbitMQ 采用类似 NIO(Non-blocking I/O)的做法,选择 TCP 连接复用,不仅可以减少性能开销,同时也便于管理。每个线程把持一个信道,所以信道复用了 Connection 的 TCP 连接。同时 RabbitMQ 可以确保每个线程的私密性,就像拥有独立的连接一样。当每个信道的流量不是很大时,复用单一的 Connection 可以在产生性能瓶颈的情况下有效地节省 TCP 连接资源。但是信道本身的流量很大时,这时候多个信道复用一个 Connection 就会产生性能瓶颈,进而使整体的流量被限制了。此时就需要开辟多个 Connection,将这些信道均摊到这些 Connection 中,至于这些相关的调优策略需要根据业务自身的实际情况进行调节。
四、AMQP消息属性详解
----
------------恢复内容结束------------
浙公网安备 33010602011771号