2021年7月,3.9 版才加入的新功能。https://www.rabbitmq.com/changelog.html
(其實一點都不新,kafka都加入10年了吧?)
官網說明 https://www.rabbitmq.com/streams.html
幾個特點(其實就是抄kafka的 stream)
1 持久化
2 append-only(不可變數據)
3 非破壞性消費者語義(non-destructive consumer semantics) 繞嘴。
使用場合:
1. 大扇出
多個消費者 消費同一個隊列的消息的時候。用stream發布1次,就不用管了。反正數據在stream里持久化了
2. 重放/時間旅行
發布的時序和持久化
3.大規模日志,性能。
但是具體實現上還是區分2種stream-core和steam-plugin
具體參見 https://gist.github.com/Gsantomaggio/149b604113bf9d2e044a0f89531c101f
Core-Stream
vs Stream-Plugin
Feature | Stream-Core | Stream-Plugin |
---|---|---|
Activation | Built-in | Must be enabled |
Protocol | AMQP 0.9.1 | RabbitMQ Stream |
Client library | AMQP 0.9.1 | RabbitMQ Stream |
Port | 5672 | 5552 |
Format | consume AMQP 0.9.1/1.0 messages | consume AMQP 0.9.1/1.0 messages |
Sub-Entry batching | Not supported | Supported |
Offset tracking | Use external store | Built-in server side |
Publishing deduplication | Not supported | Supported |
Throughput | Hundreds of thousands per second | Millions messages per second |
TLS | Supported | Supported |
See here for all the clients: https://www.rabbitmq.com/devtools.html
簡單說不用plugin的各種0.9.1的客戶端 比如js的stompjs,python的pika,clojure的langohr, 也都是可以declare/publish/subscribe stream類型的queue的。只不過性能有損失。但是對小規模應用足夠了
二 rabbitmq部署
2.1創建rabbitmq.conf
stream.advertised_host = localhost
為了publish到stream,必須聲明這個,因為stream是區分leader的。
2.2dockerfile
FROM rabbitmq:3-management LABEL purpose = 'stomp for browser js/cljs' RUN rabbitmq-plugins enable rabbitmq_stream_management rabbitmq_web_stomp COPY ./rabbitmq.conf /etc/rabbitmq/rabbitmq.conf
安裝插件,復制配置文件
2.3 docker-compose.yml
version: '3.8' services: rabbitmq-stream: restart: always build: ./ command: rabbitmq-server environment: RABBITMQ_ERLANG_COOKIE: SWQOKODSQALRPCLNMEQG RABBITMQ_DEFAULT_USER: guest RABBITMQ_DEFAULT_PASS: guest ports: - "15672:15672" # mangerment webpage - "5672:5672" #rabbitmq - "15674:15674" #web stomp - "61613:61613" #stomp - "5552:5552" # stream
2.4 啟動
docker-compose up
三 pika (python)