I. Tổng quan về RabbitMQ
1. RabbitMQ là gì?
RabbitMQ là một bộ phần mềm mã nguồn mở sử dụng giao thức AMQP (Advanced Message Queuing Protocol) phục vụ cho hệ thống gửi nhận bản tin message – oriented middleware ( hay message broker). Máy chủ RabbitMQ được viêt bằng ngôn ngữ Erlang. Các thư viện để client giao tiếp với broker được hỗ trợ trên hầu hết các ngôn ngữ (C#, C++, Java, Python, PHP, NodeJS, Objective-C…).
2. Các khái niệm trong RabbitMQ

- Producer: thực hiện quá trình gửi bản tin lên RabbitMQ server.
- Queues: có nhiệm vụ lưu trữ bản tin được gửi lên .
- Consumber: thực hiện việc lấy các bản tin từ queue về.
- Exchange: thực hiện nhiệm vụ phân phối bản tin, có 3 kiểu phân phối bản tin direct, topic, fanout. (Chi tiết xem trong mục #Routing).
*Lưu ý: Exchange chỉ nhận bản tin và lập tức gửi cho các queue có đăng ký thông tin với exchange chứ không lưu trữ các bản tin được gửi lên à nếu ko có queues nào kết nối đến exchange thì bản tin gửi lên sẽ bị drop.
3. Routing

Có 3 loại gửi bản tin: Fanout, Direct, Topic.
- Fanout (broadcast): Exchange sẽ gửi cho toàn bộ các queue đã được đăng ký
- Direct (unicast): gửi trực tiếp. [Queue (routingKey1)] chỉ nhận được các bản tin có chứa routingKey1.
- Topic (multicast): gửi theo nhóm. Các từ khóa được định nghĩa theo quy luật sau:
- Từ khoá được phân chia theo dấu ‘.‘
- * : thay thế cho 1 từ khoá
- *.* Chỉ nhận được các bản tin có tags orange ở đầu ví dụ orage.long.curly, orage.short.wave.
- *.long.* chỉ nhận được các bản tin như orange.long.bbb….
- *.* chỉ nhận được bản tin có tags 2 từ khoá
- * chỉ nhận được bản tin tags có 1 từ khoá
- # : Thay thế cho nhiều từ khoá, hoặc ko từ khoá nào (Không thể đứng đầu cụm từ khoá như #.key)
- # : thay thế cho keyword, keyword.aa.bbb, keyword.aa,…
- # : nhận tất cả các loại bản tin…
- *.# : nhận các bản tin có nhiều hơn 1 từ khoá.
II. Triển khai RabbitMQ Server
1. Cài đặt RabbitMQ Server
Phiên bản RabbitMQ hiện tại là 3.6.0 hỗ trợ hầu hết các hệ điều hành.
Hệ thống yêu cầu cài đặt ErlangOTP (version>R16B03).
- Link download ErlangOTP: erlang-solutions.com
- Link download RabbitMQ Server: rabbitmq.com
2. Các câu lệnh căn bản
- Lệnh show thông tin hệ thống
1
2
3
4
5
6
7
8
9
| rabbit# rabbitmqctl statusrabbit# rabbitmqctl cluster_statusrabbit# rabbitmqctl list_queuesrabbit# rabbitmqctl list_usersrabbit# rabbitmqctl list exchanges |
- Lệnh bật tắt server
1
2
3
4
5
| rabbit# rabbitmqctl start_app/stop_apprabbit# service rabbitmq-server stop/start/resetrabbit# rabbitmq-plugins enable management- |
3. Thiết lập RabbitMQ Server
Cấu hình RabbitMQ server gồm 2 file rabbitmq-env.conf và rabbitmq.config. Nếu trên hệ thống chưa có ta có thể tạo bằng tay.
Đường dẫn file cấu hình:
Với Linux: /etc/rabbitmq/rabbit.config và /etc/rabbitmq/rabbitmq-env.conf.
Với Windows: C:\Program Files\RabbitMQ Server\rabbitmq_server-3.6.0\etc\rabbit.config và C:\Program Files\RabbitMQ Server\rabbitmq_server-3.6.0\etc\ rabbitmq-env.conf.
File rabbitmq-env.conf là file chứa thông tin cấu hình về node name và đường dẫn config có nội dung sau:
1
2
3
4
5
| #example rabbitmq-env.conf file entries#Rename the nodeRABBIT_NODENAME=rabbit@myhost#Config file location and new filename bunnies.configRABBIT_CONFIG_FILE=/etc/rabbitmq/rabbit.config |
File rabbit.config là file chứa các thông tin cấu hình khi khởi tạo dịch vụ rabbitmq-server. File config căn bản:
1
2
3
4
5
6
7
8
9
| [{rabbit, [{auth_backends,[rabbit_auth_backend_internal]}, {default_permissions,[<<".*">>,<<".*">>,<<".*">>]}, {default_user,<<"guest">>}, {default_user_tags,[administrator]}, {default_vhost,<<"/">>} ]}]. |
4. Update lại cấu hình
Các bước update lại cấu hình của server RabbitMQ:
1
2
3
4
| rabbit# vi /etc/rabbitmq/rabbit.config...rabbit# service rabbitmq-server resetrabbit# rabbitmqctl environment |
(Check lại cấu hình thay đổi)
5. Web management plugin
Bật chức năng quản lý RabbitMQ Server trên giao diện web.
rabbitmq-plugins enable rabbitmq_management |
Cấu hình SSL: vào file cấu hình rabbit.config bổ sung cấu hình rabbitmq_management như sau:
1
2
3
4
5
6
7
8
9
| [{rabbitmq_management, [{listener, [{port, 15672}, {ssl, true}, {ssl_opts, [{cacertfile, "/path/to/cacert.pem"}, {certfile, "/path/to/cert.pem"}, {keyfile, "/path/to/key.pem"}]} ]} ]}]. |
6. Clustering

Một RabbitMQ broker là 1 nhóm gồm 1 hoặc nhiều các nodes chạy chương trình RabbitMQ và chia sẻ thông tin về users, virtual hosts, queues, exchanges… Một nhóm như vậy thường được gọi là một cluster.
Tất cả các trạng thái, dữ liệu yêu cầu để thực thi trên 1 RabbitMQ broker được lưu đồng thời trên tất cả các nodes để tăng độ tin cậy và mở rộng.
Tuy nhiên message queues lại được lưu mặc định trên node tạo ra nó (master queue), và tạo ra các bản sao slave queues trên các cluster khác, dữ liệu được lấy từ master queue mỗi khi nhận được yêu cầu từ consumer.
Một node có thể là 1 disk node hoặc 1 RAM node (là node đặc biệt chỉ lưu trữ thông tin trên RAM).
Các node chỉ có thể giao tiếp với nhau khi sửn dụng chung giá trị cookie. Đường dẫn cookie trên unix được lưu ở /var/lib/rabbitmq/.erlang.cookie.
Có 2 node rabbit1, rabbit2. Để thực hiện thiết lập clustering ta làm như sau:
1
2
3
| rabbit1# echo /var/lib/rabbitmq/.erlang.cookie…QAQPFSPCKWQXJILHMHWU |
1
2
3
4
5
6
7
8
9
| rabbit2# service rabbitmq-server stoprabbit2# echo >/var/lib/rabbitmq/.erlang.cookie [cookie_from_rabbit1]rabbit2# service rabbitmq-server startrabbit2# rabbitmqctl join_cluster rabbit@rabbit1rabbit2# rabbitmqctl cluster_statusCluster status of node rabbit@rabbit1 ...[{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2]}]},{running_nodes,[rabbit@rabbit2,rabbit@rabbit1]}]...done. |
Rời khỏi cluster:
1
2
3
| rabbit2# rabbitmqctl stop_apprabbit2# rabbitmqctl resetrabbit2# rabbitmqctl start_app |
Khởi tạo 1 RAM node:
1
2
3
4
5
6
7
8
| rabbit2# rabbitmqctl stop_apprabbit2# rabbitmqctl join_cluster –ram rabbit@rabbit1rabbit2# rabbitmqctl start_apprabbit2# rabbitmqctl cluster_statusCluster status of node rabbit@rabbit2 ...[{nodes,[{disc,[rabbit@rabbit1]},{ram,[rabbit@rabbit2]}]},{running_nodes,[rabbit@rabbit1,rabbit@rabbit2]}]...done. |
7. Thiết lập kết nối LDAP
a) Cấu hình LDAP Server
*Trong tài liệu này sử dụng OpenLDAP.
- Tạo Users group: DN: ou=Users,dc=openldap,dc=elcom,dc=com,dc=vn.
- Add các thông tin tài khoản, username là trường uid.
- Tạo Virtual hosts group: DN: ou=vhost,dc=openldap,dc=elcom,dc=com,dc=vn.
- Add Organisational Unit tên là đường dẫn virtual hosts.

b) Cấu hình RabbitMQ Server kết nối LDAP server
- Enable ldap plugin:
Rabbit# rabbitmq-plugins enable rabbitmq_auth_backend_ldap
- Cấu hình lại file config:
- Chọn phương thức authentication:
Cấu hình chỉ xác thực qua LDAP.
{rabbit,[{auth_backends, [rabbit_auth_backend_ldap]}]} |
Cấu hình trước tiên xác thực qua LDAP, nếu thất bại sẽ sử dụng thông tin tài khoản local.
rabbit,[{auth_backends, [rabbit_auth_backend_ldap, rabbit_auth_backend_internal]}]} |
- Cấu hình plugin ldap
- servers: địa chỉ server ldap.
- port: cổng kết nối server.
- user_dn_pattern: cấu hình map thông tin tài khoản với ldap, giá trị username được lấy ra bằng từ khoá ${username}.
- log: bật chức năng log khi đăng nhập (true/false/network).
- use_ssl: bật chức năng ssl.
- tag_queries: set quyền sử dụng administrator và management.
- File cấu hình mẫu:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| [ {rabbit, [{auth_backends,[rabbit_auth_backend_ldap, rabbit_auth_backend_internal]}, {default_permissions,[<<".*">>,<<".*">>,<<".*">>]}, {default_user,<<"guest">>}, {default_user_tags,[administrator]}, {default_vhost,<<"/">>} ]}, {rabbitmq_auth_backend_ldap, [ {servers, ["192.168.6.8"]}, {port, 389}, {user_dn_pattern, "uid=${username},ou=Users,dc=openldap,dc=elcom,dc=com,dc=vn"}, {log, network}, {use_ssl, false}, {tag_queries, [{administrator, {constant, true}}, {management, {constant, true}}]} ]}]. |
- Reset lại server:
rabbit# service rabbitmq-server reset |
III.Triển khai RabbitMQ Client
1. Khởi tạo project
- Với Java:
- Tạo maven project
- Add dependency:
<dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId> <version>3.6.0</version></dependency> |
- Với C++:
- Tải lib SimpleAMQPClient: https://github.com/alanxz/SimpleAmqpClient
Nguồn: duongtx90
No comments:
Write comments