2012/06/19

ActiveMQ - 訊息傳遞的仲介

ActiveMQ 是一種 Message-oriented middleware,主要是當作不同 process 或不同主機間的溝通媒介。

會用到 queue 的時機點有很多,就我個人工作上的範疇,通常是
1. Web server 短時間內遇到大量的 request,需要先接起來再由後端子系統處理,達到分散式架構
2. 這件事情本來就沒有很急,丟在 queue 裡面慢慢處理就好


類似 ActiveMQ 的 product 還有 RabbitMQZeroMq這邊列出了更多種的選擇。我的需求很基本,通常會考量幾個點:
1. 夠不夠 robust
2. Client端有沒有支援熟悉的語言 (C/C++, Java, .Net, Python, Php, Ruby, ...)
3. 文件寫得夠不夠清楚
4. 有在持續維護中

本來想用 C 來連接 ActiveMQ,但發現所有的 C library都沒在維護了,而且也沒 API 文件可以看,是有 C++ 的 ActiveMQ-CPP 可以用,但我不熟lol,最後選擇了 Python 的,pyactivemq也是一段時間沒更新了,重點是編譯不過,stomppy 或許是個不錯的選擇:)

訊息交換方式可以參考 Messaging pattern 裡面定義的,而我常用的也就下面兩種:
1. Push - Pull
2. Publish - Subscribe
這也是大多 product 都支援的

上述講得是 application 層的 ,至於 ActiveMQ 底層的傳輸 protocol 有二
1. STOMP (Streaming Text Oriented Messaging Protocol)
2. OpenWire protocol
差別在哪不是很清楚...只知道 stomp 是個大家熟知的標準,follow就對了!

意外發現一篇好文章,是在 promote ZeroMQ 的:
新世紀通訊函式庫 – ZeroMQ | 程式設計 遇上 小提琴

--

發現 ActiveMQ-CPP 裡面也有提供 C 的 interface,終於不用被 C++ 所擾,在 tar 檔裡面找不到,在 github 上才有,連結在此

編譯 ActiveMQ-CPP
需要 Apache Portable Runtime 支援,我使用的版本搭配如下:
activemq-cpp-library-3.4.x (直接從 github 抓下來)
apr-1.3.12
apr-util-1.3.12
$ cd apache-activemq-cpp/activemq-cpp
$ ./autogen.sh
...
configure.ac:239: the top level
configure.ac: installing `config/install-sh'
configure.ac: installing `config/missing'
src/examples/Makefile.am: installing `config/depcomp'
src/main/Makefile.am: C objects in subdir but `AM_PROG_CC_C_O' not in `configure.ac'
src/main/Makefile.am: installing `config/compile'
autoreconf: automake failed with exit status: 1

$ vim configure.ac
...
 AC_PROG_CC
 AC_PROG_CXX
+AM_PROG_CC_C_O
 AC_LIBTOOL_WIN32_DLL
 AC_PROG_LIBTOOL

$ ./autogen.sh
$ ./configure --with-apr=/opt/apr-1.3.12 --with-apr-util=/opt/apr-util-1.3.12 --prefix=/opt/activemq-cpp
$ make && make install

編譯 ActiveMQ-C
apr 版本限制 1.3.x,太高太低都不行
$ cd apache-activemq-cpp/activemq-c
$ ./autogen.sh
aclocal: couldn't open directory `config': No such file or directory
autoreconf: aclocal failed with exit status: 1

$ mkdir config
$ ./autogen.sh
configure.ac:82: the top level
configure.ac: installing `config/install-sh'
configure.ac: installing `config/missing'
src/examples/Makefile.am: C objects in subdir but `AM_PROG_CC_C_O' not in `configure.ac'
src/examples/Makefile.am: installing `config/compile'
src/examples/Makefile.am: installing `config/depcomp'
autoreconf: automake failed with exit status: 1

$ vim configure.ac
 AC_PROG_CC
 AC_PROG_CXX
+AM_PROG_CC_C_O
 AC_LIBTOOL_WIN32_DLL
 AC_PROG_LIBTOOL
$ ./autogen.sh
$ ./configure --with-activemqcpp=/opt/activemq-cpp --with-apr=/opt/apr-1.3.12 --with-apr-util=/opt/apr-util-1.3.12 --prefix=/opt/activemq-c
$ make && make install
測試 sample code
$ cd apache-activemq-cpp/activemq-c/src/examples/producers
$ gcc -o SimpleProducer SimpleProducer.c -I/opt/activemq-c/include/activemq-c-3.3.0 -I/opt/apr-1.3.12/include -L/opt/activemq-c/lib -L/opt/apr-1.3.12/lib  -lactivemq-c -lapr-1
$ LD_LIBRARY_PATH=/opt/activemq-c/lib:/opt/activemq-cpp/lib:/opt/apr-1.3.12/lib ./SimpleProducer
=====================================================
Starting the SimpleProducer:
-----------------------------------------------------
-----------------------------------------------------
Finished with the SimpleProducer.
=====================================================
Good, it's work!


沒有留言:

張貼留言