oracle 資料透過goldengate 實時同步到kafka訊息佇列中
背景
在大資料時代,存在大量基於資料的業務。資料需要在不同的系統之間流動、整合。通常,核心業務系統的資料存在OLTP資料庫系統中,其它業務系統需要獲取OLTP系統中的資料。傳統的數倉透過批次資料同步的方式,定期從OLTP系統中抽取資料。但是隨著業務需求的升級,批次同步無論從實時性,還是對線上OLTP系統的抽取壓力,都無法滿足要求。需要實時從OLTP系統中獲取資料變更,實時同步到下游業務系統。
本次是基於Oracle OGG,介紹一種將Oracle資料庫的資料實時同步到Kafka訊息佇列的方法。
Kafka 是一種高效的訊息佇列實現,透過訂閱kafka的訊息佇列,下游系統可以實時獲取線上Oracle系統的資料變更情況,實現業務系統。
環境介紹
元件版本
元件 |
版本 |
描述 |
源端oracle |
oracle 11.2.0.4 for linux x64 |
源端oracle |
源端ogg |
oracle ogg 11.2.0.1.20 for oracle linux x64 |
源端ogg,用於抽取源端oracle的資料變更,並將變更日誌傳送目標端 |
目標端kafka |
kafka_2.11-0.11.0.2 for linux x64 |
訊息佇列,接收目標端ogg推送過來的資料 |
目標端ogg |
|
目標端ogg,接收源端傳送的oracle事物變更日誌,並將變更推送到kafka訊息佇列中 |
整體架構圖
名詞解釋
1.OGG Manager
OGG Manager 用於配置和管理其它 OGG 元件,配置資料抽取、資料推送、資料複製,啟動和停止相關元件,檢視相關元件的執行情況。
2. 資料抽取( Extract )
抽取源端資料庫的變更( DML, DDL )。資料抽取主要分如下幾種型別:本地抽取從本地資料庫捕獲增量變更資料,寫入到本地 Trail 檔案資料推送( Data Pump )從本地 Trail 檔案讀取資料,推送到目標端。初始資料抽取從資料庫表中匯出全量資料,用於初次資料載入
3. 資料推送( Data Pump )
Data Pump 是一種特殊的資料抽取( Extract )型別,從本地 Trail 檔案中讀取資料,並透過網路將資料傳送到目標端 OGG
4.Trail 檔案
資料抽取從源端資料庫抓取到的事物變更資訊會寫入到 Trail 檔案。
5. 資料接收( Collector )
資料接收程式執行在目標端機器,用於接收 Data Pump 傳送過來的 Trail 日誌,並將資料寫入到本地 Trail 檔案。
6. 資料複製( Replicat )
資料複製執行在目標端機器,從 Trail 檔案讀取資料變更,並將變更資料應用到目標端資料儲存系統。本案例中,資料複製將資料推送到 kafka 訊息佇列。
7. 檢查點( Checkpoint )
檢查點用於記錄資料庫事物變更。
操作步驟
源端Oracle資料庫配置
開啟源端歸檔
SQL> archive log list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /u01/app/oracle/product/11.2.3/db_1/dbs/arch
Oldest online log sequence 12
Next log sequence to archive 17
Current log sequence 17
若為開啟歸檔解決如下:
conn / as sysdba (以DBA身份連線資料庫)
shutdown immediate (立即關閉資料庫)
startup mount (啟動例項並載入資料庫,但不開啟)
alter database archivelog; (更改資料庫為歸檔模式)
alter database open; (開啟資料庫)
alter system archive log start; (啟用自動歸檔)
2) OGG 基於輔助日誌等進行實時傳輸,故需要開啟相關日誌確保可獲取事務內容,透過下面的命令檢視該狀態
SQL> select force_logging, supplemental_log_data_min, supplemental_log_data_all from v$database;
FORCE_LOGG SUPPLEMENTAL_LOG_DATA_MI
---------- ------------------------
YES YES
如果沒有開啟輔助日誌,需要開啟
SQL> alter database force logging;
SQL> alter database add supplemental log data;
SQL>alter database add supplemental log data(all) columns;
3. 開啟 goldengate 複製引數
SQL> alter system set enable_goldengate_replication = true;
4. 建立源端 Oracle 賬號
SQL> create tablespace tbs_ogg datafile '/oradata/dtstack/tbs_ogg.dbf' size 1024M autoextend on;
SQL> create user ggsadmin identified by oracle default tablespace tbs_ogg;
SQL> grant dba to ggsadmin;
5. 建立測試表 ( 生產略 )
SQL> create table baiyang.ora_to_kfk as select OWNER, OBJECT_NAME, SUBOBJECT_NAME, OBJECT_ID, DATA_OBJECT_ID, OBJECT_TYPE from all_objects where object_id < 500;
SQL> alter table baiyang.ora_to_kfk add constraint pk_kfk_obj primary key(object_id);
SQL> select count(*) from baiyang.ora_to_kfk;
COUNT(*)
----------
436
部署ogg
源端 (oracle源端)
1、解壓
先建立ogg目錄
mkdir -p /ogg
tar xf fbo_ggs_Linux_x64_ora11g_64bit.tar -C /ogg
chown -R oracle:oinstall /ogg (使oracle使用者有ogg的許可權,後面有些需要在oracle使用者下執行才能成功)
2配置ogg環境變數
為了簡單方便起見,建議在生產中配置 oracle 的環境變數檔案 /home/oracle/.bash_profile 裡配置
export JAVA_HOME=/usr/local/java1.8
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/jre/lib/rt.jar
export JAVA=$JAVA_HOME/bin/java
export OGG_HOME=/ogg
export PATH=$PATH:$OGG_HOME
export LD_LIBRARY_PATH=$JAVA_HOME/jre/lib/amd64:$JAVA_HOME/jre/lib/amd64/server:$JAVA_HOME/jre/lib/amd64/libjsig.so:$JAVA_HOME/jre/lib/amd64/server/libjvm.so
生效環境變數
source /home/oracle/.bash_profile
3、OGG初始化
ggsci
create subdirs
ggsci
Oracle GoldenGate Command Interpreter for Oracle
Version 11.2.1.0.3 14400833 OGGCORE_11.2.1.0.3_PLATFORMS_120823.1258_FBO
Linux, x64, 64bit (optimized), Oracle 11g on Aug 23 2012 20:20:21
Copyright (C) 1995, 2012, Oracle and/or its affiliates. All rights reserved.
GGSCI (ambari.master.com) 1> create subdirs
Creating subdirectories under current directory /root
Parameter files /root/dirprm: created
Report files /root/dirrpt: created
Checkpoint files /root/dirchk: created
Process status files /root/dirpcs: created
SQL script files /root/dirsql: created
Database definitions files /root/dirdef: created
Extract data files /root/dirdat: created
Temporary files /root/dirtmp: created
Stdout files /root/dirout: created
4、 配置源端 Manager
GGSCI (dtproxy) 4> dblogin userid ggsadmin password oracle
GGSCI (dtproxy as ggsadmin@dtstack) 5> edit param ./globals
-- 新增
oggschema ggsadmin
GGSCI (dtproxy as ggsadmin@dtstack) 6> edit param mgr
---- 新增
PORT 7810 --預設監聽埠
DYNAMICPORTLIST 7811-7820 --動態埠列表
AUTORESTART EXTRACT *,RETRIES 5,WAITMINUTES 3 --程式有問題,每3分鐘重啟一次,一共重啟五次
PURGEOLDEXTRACTS ./dirdat/ , USECHECKPOINTS, MINKEEPDAYS 7 --/
LAGREPORTHOURS 1 --每隔一小時檢查一次傳輸延遲情況
LAGINFOMINUTES 30 --傳輸延時超過30分鐘將寫入錯誤日誌
LAGCRITICALMINUTES 45 --傳輸延時超過45分鐘將寫入警告日誌
PURGEMARKERHISTORY MINKEEPDAYS 3, MAXKEEPDAYS 7 --定期清理trail檔案
--ACCESSRULE, PROG , IPADDR 172.. ., ALLOW --設定172網段可連線
5 、新增同步表級別日誌
GGSCI (dtproxy as ggsadmin@dtstack) 9> add trandata baiyang.ora_to_kfk
GGSCI (dtproxy as ggsadmin@dtstack) 10> info trandata baiyang.ora_to_kfk
目標端 (kafka目標端)
1、 解壓
mkdir -p /ogg
unzip V839824-01.zip
tar xf ggs_Adapters_Linux_x64.tar -C /ogg/
2配置ogg環境變數
為了簡單方便起見,建議在生產中配置 oracle 的環境變數檔案 /home/oracle/.bash_profile 裡配置
export JAVA_HOME=/usr/local/java1.8/jre
export PATH=$JAVA_HOME/bin:$PATH
export LD_LIBRARY_PATH=$JAVA_HOME/lib/amd64/server:$JAVA_HOME/lib/amd64:$LD_LIBRARY_PATH
export OGG_HOME=/ogg
export PATH=$PATH:$OGG_HOME
export LD_LIBRARY_PATH=$JAVA_HOME/jre/lib/amd64:$JAVA_HOME/jre/lib/amd64/server:$JAVA_HOME/jre/lib/amd64/libjsig.so:$JAVA_HOME/jre/lib/amd64/server/libjvm.so
生效環境變數
source /home/oracle/.bash_profile
OGG初始化
ggsci
create subdirs
ggsci
Oracle GoldenGate Command Interpreter for Oracle
Version 11.2.1.0.3 14400833 OGGCORE_11.2.1.0.3_PLATFORMS_120823.1258_FBO
Linux, x64, 64bit (optimized), Oracle 11g on Aug 23 2012 20:20:21
Copyright (C) 1995, 2012, Oracle and/or its affiliates. All rights reserved.
GGSCI (ambari.master.com) 1> create subdirs
Creating subdirectories under current directory /root
Parameter files /root/dirprm: created
Report files /root/dirrpt: created
Checkpoint files /root/dirchk: created
Process status files /root/dirpcs: created
SQL script files /root/dirsql: created
Database definitions files /root/dirdef: created
Extract data files /root/dirdat: created
Temporary files /root/dirtmp: created
Stdout files /root/dirout: created
配置源端 Manager
GGSCI (dtproxy as ggsadmin@dtstack) 6> edit param mgr
---- 新增
PORT 7810 --預設監聽埠
DYNAMICPORTLIST 7811-7820 --動態埠列表
AUTORESTART EXTRACT *,RETRIES 5,WAITMINUTES 3 --程式有問題,每3分鐘重啟一次,一共重啟五次
PURGEOLDEXTRACTS ./dirdat/ , USECHECKPOINTS, MINKEEPDAYS 7
PURGEMARKERHISTORY MINKEEPDAYS 3, MAXKEEPDAYS 7 --定期清理trail檔案
--ACCESSRULE, PROG , IPADDR 172.. ., ALLOW --設定172網段可連線
GGSCI (172-16-101-242) 4> edit param ./GLOBALS
-- 新增
CHECKPOINTTABLE ggsadmin.checkpoint
全量資料同步(oracle to kafka)
1. 配置源端資料初始化
1) 配置源端初始化程式
GGSCI (dtproxy as ggsadmin@dtstack) 15> add extract initkfk,sourceistable
2) 配置源端初始化引數
GGSCI (dtproxy as ggsadmin@dtstack) 16> edit params initkfk
EXTRACT initkfk
SETENV (NLS_LANG=AMERICAN_AMERICA.AL32UTF8)
USERID ggsadmin,PASSWORD oracle
RMTHOST
172.16.101.242
, MGRPORT 7810
RMTFILE ./dirdat/ek,maxfiles 999, megabytes 500
table baiyang.ora_to_kfk;
3 )源端生成表結構 define 檔案
GGSCI (dtproxy as ggsadmin@dtstack) 17> edit param define_kfk
-- 新增
defsfile /ogg/dirdef/define_kfk.txt
userid ggsadmin,password oracle
table baiyang.ora_to_kfk;
4 )獲取 oracle 全量資料
$cd /ogg
$./defgen paramfile dirprm/define_kfk.prm
-- Definitions generated for 1 table in /oradata/oggorcl/ogg/dirdef/define_kfk.txt
5) 將獲取全量資料記錄傳送到目標端
- 將此檔案傳輸到目標段dirdef資料夾
scp /ogg/dirdef/define_kfk.txt 172.16.101.242:/ogg/dirdef/define_kfk.txt
2、 配置目標端資料初始化程式
1) 配置目標端初始化程式
GGSCI (172-16-101-242) 3> ADD replicat initkfk,specialrun
2) 配置目標端初始化引數
GGSCI (172-16-101-242) 6> edit params initkfk
-- 新增
SPECIALRUN
end runtime
setenv(NLS_LANG="AMERICAN_AMERICA.AL32UTF8")
targetdb libfile libggjava.so set property=./dirprm/kafka.props
SOURCEDEFS ./dirdef/define_kfk.txt
REPLACEBADCHAR SKIP
SOURCECHARSET OVERRIDE ISO-8859-1
EXTFILE ./dirdat/ek
reportcount every 1 minutes, rate
grouptransops 10000
map baiyang.ora_to_kfk,target baiyang.ora_to_kfk;
3) 配置 ogg 針對 kafka 相關引數
vi ./dirprm/kafka.props
-- 新增
gg.handlerlist=kafkahandler
gg.handler.kafkahandler.type=kafka
gg.handler.kafkahandler.format.includePrimaryKeys=true
gg.handler.kafkahandler.KafkaProducerConfigFile=custom_kafka_producer.properties
gg.handler.kafkahandler.topicName=test_ogg --舊版引數,本次使用舊版引數
#gg.handler.kafkahandler.topicMappingTemplate=test_ogg –-新版本引數
gg.handler.kafkahandler.format=json
gg.handler.kafkahandler.mode=op
gg.classpath=dirprm/:/kafka/libs/* :/ogg/:/ogg/lib/*
kafka 安裝的位置 ogg安裝的位置
將 ./dirprm/kafka.props 檔案複製到 /ogg/AdapterExamples/big-data/kafka 目錄下
vi ./dirprm/custom_kafka_producer.properties
bootstrap.servers= 172.16.101.242:9092 ---kafka地址
acks=-1
compression.type=gzip
reconnect.backoff.ms=1000
value.serializer=org.apache.kafka.common.serialization.ByteArraySerializer
key.serializer=org.apache.kafka.common.serialization.ByteArraySerializer
batch.size=102400 --資料有堆積
linger.ms=10000 --資料傳輸kafka有延時
將 ./dirprm/custom_kafka_producer.properties 檔案複製到 /ogg/AdapterExamples/big-data/kafka
3、 開啟抽取全量任務
源端:
GGSCI (dtproxy) 20> start mgr
GGSCI (dtproxy) 21> start initkfk
目標端全量資料應用
GGSCI (172-16-101-242) 13> start mgr
cd /ogg
./replicat paramfile ./dirprm/initkfk.prm reportfile ./dirrpt/init01.rpt -p INITIALDATALOAD
--檢視應用日誌是否有錯誤
cd /opt/ogg/dirrpt
more init01.rpt
4、 驗證 kafka 全量資料
cd /kafka
bin/kafka-console-consumer.sh --bootstrap-server 172.16.101.242:9092 --topic test_ogg --from-beginning
{"table":"BAIYANG.ORA_TO_KFK","op_type":"I","op_ts":"2019-11-11 20:23:19.703779","current_ts":"2019-11-11T20:48:55.946000","pos":"-0000000000000000001","after":{"OWNER":"SYS","OBJECT_NAME":"C_OBJ#","SUBOBJECT_NAME":null,"OBJECT_ID":2,"DATA_OBJECT_ID":2,"OBJECT_TYPE":"CLUSTER"}}
{"table":"BAIYANG.ORA_TO_KFK","op_type":"I","op_ts":"2019-11-11 20:23:19.703779","current_ts":"2019-11-11T20:48:56.289000","pos":"-0000000000000000001","after":{"OWNER":"SYS","OBJECT_NAME":"I_OBJ#","SUBOBJECT_NAME":null,"OBJECT_ID":3,"DATA_OBJECT_ID":3,"OBJECT_TYPE":"INDEX"}}
全量資料已經同步到目標 kafka topic test_ogg
增量資料同步(oracle to kafka)
源端配置
1. 源端抽取程式配置
GGSCI (dtproxy) 9> edit param extkfk
-- 新增
extract extkfk
dynamicresolution
SETENV (ORACLE_SID = " orcl")
SETENV (NLS_LANG = "american_america.AL32UTF8")
userid ggsadmin,password oracle
FETCHOPTIONS NOUSESNAPSHOT
GETUPDATEBEFORES
NOCOMPRESSDELETES
NOCOMPRESSUPDATES
exttrail ./dirdat/to
table baiyang.ora_to_kfk;
2、 新增 extract 程式
GGSCI (dtproxy) 10> add extract extkfk,tranlog,begin now
GGSCI (dtproxy) 11> add exttrail ./dirdat/to,extract extkfk
3、 配置源端推送程式
GGSCI (dtproxy) 12> edit param pupkfk
-- 新增
extract pupkfk
passthru
dynamicresolution
userid ggsadmin,password oracle
rmthost 172.16.101.242 mgrport 7810
rmttrail ./dirdat/to
table baiyang.ora_to_kfk;
4 、新增投遞程式
GGSCI (dtproxy) 13> add extract pupkfk,exttrailsource ./dirdat/to
GGSCI (dtproxy) 14> add rmttrail ./dirdat/to,extract pupkfk
目標端配置
1、 配置目標端恢復程式
edit param repkfk
-- 新增
REPLICAT repkfk
SOURCEDEFS ./dirdef/define_kfk.txt
targetdb libfile libggjava.so set property=./dirprm/kafka.props
REPORTCOUNT EVERY 1 MINUTES, RATE
GROUPTRANSOPS 10000
MAP baiyang.ora_to_kfk, TARGET baiyang.ora_to_kfk;
2、 新增 trail 檔案到 replicate 程式
add replicat repkfk exttrail ./dirdat/to,checkpointtable ggsadmin.checkpoint
開啟增量實時資料抓取
源端:
./ggsci
GGSCI (dtproxy) 5> start extkfk
Sending START request to MANAGER ...
EXTRACT EXTKFK starting
GGSCI (dtproxy) 6> start pupkfk
Sending START request to MANAGER ...
EXTRACT PUPKFK starting
GGSCI (dtproxy) 7> status all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
EXTRACT RUNNING EXTKFK 00:00:00 00:00:10
EXTRACT RUNNING PUPKFK 00:00:00 00:00:00
目標端:
/ggsci
GGSCI (172-16-101-242) 7> start replicat repkfk
Sending START request to MANAGER ...
REPLICAT REPKFK starting
GGSCI (172-16-101-242) 8> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
REPLICAT RUNNING REPKFK 00:00:00 00:00:00
測試增量資料抓取
源端:
Oracle插入增量資料
SQL> insert into baiyang.ora_to_kfk select OWNER, OBJECT_NAME, SUBOBJECT_NAME, OBJECT_ID, DATA_OBJECT_ID, OBJECT_TYPE from all_objects where object_id >500 and object_id < 1000;
SQL> commit;
SQL> select count(*) from baiyang.ora_to_kfk;
COUNT(*)
905
目標端:
檢視 Kafka 訊息佇列消費資料
cd /kafka
bin/kafka-console-consumer.sh --bootstrap-server 172.16.101.242:9092 --topic test_ogg
{"table":"BAIYANG.ORA_TO_KFK","op_type":"I","op_ts":"2019-11-11 21:04:11.158786","current_ts":"2019-11-11T21:10:54.042000","pos":"00000000000000075298","after":{"OWNER":"SYS","OBJECT_NAME":"APPLY$_READER_STATS","SUBOBJECT_NAME":null,"OBJECT_ID":998,"DATA_OBJECT_ID":998,"OBJECT_TYPE":"TABLE"}}
{"table":"BAIYANG.ORA_TO_KFK","op_type":"I","op_ts":"2019-11-11 21:04:11.158786","current_ts":"2019-11-11T21:10:54.042001","pos":"00000000000000075459","after":{"OWNER":"SYS","OBJECT_NAME":"APPLY$_READER_STATS_I","SUBOBJECT_NAME":null,"OBJECT_ID":999,"DATA_OBJECT_ID":999,"OBJECT_TYPE":"INDEX"}}
DDL 操作
如果 ogg 源端,也就是 oracle 端的表增加欄位或者刪除欄位,或者修改欄位等等,只要是修改表結構定義的,就算是 DDL 操作,在 ogg for bigdata 12.2 穩定版本中,目前是不支援同步 ddl 語句的,在 12,3 版本以後會進行 ddl 支援。
在 12.2 ogg for bigdata 中,源端如果做 ddl ,需要在源端的定義表結構檔案中重新生成 define_kfk.txt 檔案的定義,並將 define_kfk.txt 檔案傳輸到目標端中。
舉例說明:
源端:(oracle端)
1) 源表新增id欄位
alter table ORA_TO_KFK add id number;
2) ogg 源端需要重新生成表定義檔案
mv /ogg/dirdef/define_kfk.txt /ogg/dirdef/define_kfk.txt.bak1
cd /ogg
/defgen paramfile dirprm/define_kfk.prm
3) 將生成的表定義檔案scp 到目標端
cd /ogg
scp ./dirdef/define_kfk.txt root@192.168.56.57:/ogg/dirdef/
4) 源端抽取程式需要重啟
GGSCI (edsir1p9) 2> stop EXTKFK
Sending STOP request to EXTRACT EXTKFK ...
Request processed.
GGSCI (edsir1p9) 3> start EXTKFK
Sending START request to MANAGER ...
EXTRACT EXTKFK starting
GGSCI (edsir1p9) 4> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
EXTRACT RUNNING EXTKFK 00:00:00 00:00:08
EXTRACT RUNNING PUPKFK 00:00:00 00:00:07
目標端:(kafka端)
1)檢視目標端的應用程式發生了abend
GGSCI (node) 38> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
REPLICAT ABENDED REPKFK 00:10:27 00:05:29
2)啟動複製程式
GGSCI (node) 40> start REPKFK
Sending START request to MANAGER ...
REPLICAT REPKFK starting
GGSCI (node) 9> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
REPLICAT RUNNING REPKFK 00:00:00 00:00:04
測試:
源端插入一條資料
SQL> insert into ORA_TO_KFK(OWNER,OBJECT_NAME,OBJECT_ID,ID) values ('gg','gg',876,9);
1 row created.
SQL> commit;
目標端:
cd /kafka
bin/kafka-console-consumer.sh --bootstrap-server 192.168.56.57:9092 --topic ogg_test
資料已經從源端oracle同步到目標端kafka中。至此oracle新新增一列,可以正常同步到kafka中。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30345407/viewspace-2683027/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Debezium vs OGG vs Tapdata:如何實時同步 Oracle 資料到 Kafka 訊息佇列?OracleKafka佇列
- Kafka訊息佇列Kafka佇列
- kafka 訊息佇列Kafka佇列
- 訊息佇列之 Kafka佇列Kafka
- 實時數倉之Flink消費kafka訊息佇列資料入hbaseKafka佇列
- PHP Kafka 訊息佇列使用PHPKafka佇列
- 訊息佇列中的Oracle佇列Oracle
- Redis 應用-非同步訊息佇列與延時佇列Redis非同步佇列
- 阿里雲訊息佇列 Kafka-訊息檢索實踐阿里佇列Kafka
- 透過 Canal 將 MySQL 資料實時同步到 EasysearchMySql
- oracle佇列(AQ)---實現orale到mysql的資料同步Oracle佇列MySql
- “簡單”的訊息佇列與kafka佇列Kafka
- 訊息佇列Kafka學習總結佇列Kafka
- c# 透過訊息佇列處理高併發請求實列C#佇列
- 「訊息佇列」看過來!佇列
- 訊息佇列的使用場景之kafka佇列Kafka
- CentOS 7.0 安裝配置 kafka 訊息佇列CentOSKafka佇列
- 快速理解Kafka分散式訊息佇列框架Kafka分散式佇列框架
- ETL資料整合丨透過ETLCloud工具,將Oracle資料實時同步至Doris中CloudOracle
- 訊息佇列系列一:訊息佇列應用佇列
- 訊息佇列Kafka「檢索元件」重磅上線!佇列Kafka元件
- KOA + egg.js 整合 kafka 訊息佇列JSKafka佇列
- 技術分享| 訊息佇列Kafka群集部署佇列Kafka
- Redis實現訊息佇列Redis佇列
- 訊息佇列之Kafka——從架構技術重新理解Kafka佇列Kafka架構
- 訊息佇列佇列
- 訊息佇列之事務訊息,RocketMQ 和 Kafka 是如何做的?佇列MQKafka
- RabbitMQ,RocketMQ,Kafka 幾種訊息佇列的對比MQKafka佇列
- [訊息佇列]kafka高效能/高吞吐量佇列Kafka
- Python中執行緒的MQ訊息佇列實現以及訊息佇列的優點解析Python執行緒MQ佇列
- Kafka 延時佇列&重試佇列Kafka佇列
- 訊息佇列(MQ)佇列MQ
- RabbitMQ訊息佇列MQ佇列
- POSIX訊息佇列佇列
- 訊息佇列(一)佇列
- 訊息佇列(二)佇列
- 訊息佇列二佇列
- [Redis]訊息佇列Redis佇列