Friday, April 20, 2018

RabbitMQ

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

Screenshot 2016-02-21 02.58.06
  • 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

Screenshot 2016-02-21 03.02.03
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.curlyorage.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).

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 status
rabbit# rabbitmqctl cluster_status
rabbit# rabbitmqctl list_queues
rabbit# rabbitmqctl list_users
rabbit# rabbitmqctl list exchanges
  • Lệnh bật tắt server
1
2
3
4
5
rabbit# rabbitmqctl start_app/stop_app
rabbit# service rabbitmq-server stop/start/reset
rabbit# 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 node
RABBIT_NODENAME=rabbit@myhost
#Config file location and new filename bunnies.config
RABBIT_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 reset
rabbit# 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
Truy cập địa chỉ https://localhost:15672/, đăng nhập với tài khoản guest/guest.
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

Picture1
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 stop
rabbit2# echo >/var/lib/rabbitmq/.erlang.cookie [cookie_from_rabbit1]
rabbit2# service rabbitmq-server start
rabbit2# rabbitmqctl join_cluster rabbit@rabbit1
rabbit2# rabbitmqctl cluster_status
Cluster 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_app
rabbit2# rabbitmqctl reset
rabbit2# rabbitmqctl start_app
Khởi tạo 1 RAM node:
1
2
3
4
5
6
7
8
rabbit2# rabbitmqctl stop_app
rabbit2# rabbitmqctl join_cluster –ram rabbit@rabbit1
rabbit2# rabbitmqctl start_app
rabbit2# rabbitmqctl cluster_status
Cluster 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.
Picture2

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>
Nguồn: duongtx90

No comments:
Write comments