因?yàn)橐鎸?duì)高并發(fā)PUSH需求,考慮將其按隊(duì)列方式實(shí)現(xiàn),最終選型Kestrel。
至于Kestrel:
可支持的標(biāo)準(zhǔn)協(xié)議:
擴(kuò)展協(xié)議:
經(jīng)測(cè)試,支持 DELETE 協(xié)議!
PS: XMemcached-1.2 及其以上版本已對(duì)其協(xié)議完全支持,注意使用 KestrelCommandFactory 。
當(dāng)然, Redis 也可以做消息隊(duì)列,但 Redis 目前只是 Master-Slave 模式,還不能像 Kestrel 做到 Cluster 。所以,如果只是考慮隊(duì)列服務(wù),還是純粹一點(diǎn),直接用 Kestrel ,配合 XMemcached 作為客戶端,保持一致性哈希,用起來更放心。因?yàn)椋呖捎寐铮『呛牵?
想要消化Kestrel,需要做些準(zhǔn)備工作:
本想Git下來,逐個(gè)編譯一把,但始終未果,只好找兄弟copy一份來運(yùn)行!
我會(huì)在附件中,追加相應(yīng)的配置文件,以及kestrel-2.1.5.jar。
如果你的Server還沒有安裝Daemon,參考如下操作:
一、Kestrel目錄結(jié)構(gòu)
Kestrel目錄結(jié)構(gòu)如下:
Kestrel
|-kestrel-1.2.7-SNAPSHOT.jar
|-kestrel-1.2.7-SNAPSHOT.pom
|-config
|-development.conf
|-production.conf
|-libs
|-scripts
|-devel.sh
|-kestrel.sh
|-qdump.sh
libs中的jar列表:
由于附件體積限制,可能需要另行下載(Maven是個(gè)好幫手!
)
我們只需要關(guān)注以下幾個(gè)文件:
適用于開發(fā)環(huán)境:
適用于生產(chǎn)環(huán)境:
二、Kestrel腳本&配置說明
這里將Kestrel安裝至 /opt/servers/kestrel 路徑下,你可能需要對(duì)應(yīng)修改路徑配置。
先說用于開發(fā)環(huán)境的腳本&配置文件:
devel.sh
#!/bin/bash
APP_NAME="kestrel"
#應(yīng)用路徑
APP_PATH="/opt/servers/kestrel"
#版本
VERSION="1.2.7-SNAPSHOT"
echo "Starting kestrel in development mode..."
java -server -Xmx1024m -Dstage=development -jar $APP_PATH/$APP_NAME-$VERSION.jar
注意修改 APP_PATH !
development.conf
# kestrel config for a production system
# where to listen for connections:
port = 22133
host = "0.0.0.0"
log {
#日志路徑
filename = "/var/logs/kestrel_development.log"
roll = "daily"
level = "info"
}
queue_path = "/var/spool/kestrel"
做一個(gè)簡(jiǎn)單的測(cè)試:
進(jìn)行如下操作:
telnet localhost 22133
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
set x 0 0 5
12345
STORED
在另一個(gè)終端上獲得該消息:
telnet localhost 22133
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
get x
VALUE x 0 5
12345
END
get x
END
如上操作,說明配置已成功。
如法炮制生產(chǎn)環(huán)境配置:
kestrel.sh
APP_NAME="kestrel"
VERSION="1.2.7-SNAPSHOT"
#Kestrel路徑
APP_HOME="/opt/servers/$APP_NAME"
AS_USER="daemon"
DAEMON="/usr/local/bin/daemon"
QUEUE_PATH="/var/spool/kestrel"
HEAP_OPTS="-Xmx2048m -Xms1024m -XX:NewSize=256m"
JMX_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=22134 -Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false"
# add JMX_OPTS below if you want jmx support.
#如果需要控制字符集,使用-Dfile.encoding=UTF8
JAVA_OPTS="-server -verbosegc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintTenuringDistribution -XX:+
UseConcMarkSweepGC -XX:+UseParNewGC $HEAP_OPTS"
你可能需要修改APP_HOME變量
production.conf
# kestrel config for a production system
# where to listen for connections:
port = 22133
#建議綁定主機(jī)IP
host = "0.0.0.0"
log {
filename = "/var/logs/kestrel.log"
roll = "daily"
level = "info"
}
#隊(duì)列存儲(chǔ)路徑,用于存儲(chǔ)/恢復(fù)隊(duì)列消息,建議存放在磁盤較大的區(qū)域
queue_path = "/var/spool/kestrel"
建議綁定 host ,確保服務(wù)器安全
可以重復(fù)上述測(cè)試操作,測(cè)試服務(wù)是否可用!
或者,直接查看服務(wù)狀態(tài)——STATS!
最后,拷貝 kestrel.sh 文件到 /etc/init.d/ 路徑下,并賦予執(zhí)行權(quán)限:
后續(xù),我們就可以通過服務(wù)方式,調(diào)用kestrel了!
service kestrel {start|stop|restart|status}
由于jar文件較大,未在附件內(nèi)上傳外,其余配置文件相見附件!
PS:重點(diǎn)說明一點(diǎn),隊(duì)列名稱/緩存鍵名稱,一定不要始終“-”作為連接符,請(qǐng)使用“_”作為連接符,避免意想不到的錯(cuò)誤。!
相關(guān)鏈接:
征服 Kestrel
征服 Kestrel + XMemcached
征服 Kestrel + XMemcached + Spring TaskExecutor
至于Kestrel:
- 基于Scala語言的Twitter開源消息中間件
- 高性能(TPS 6000不成問題)、小巧(2K行代碼)、持久存儲(chǔ)(記錄日志到j(luò)ournal)并且可靠(支持可靠獲取)
- Kestrel 的前身是 Ruby 寫的 Starling 項(xiàng)目,后來twitter的開發(fā)人員嘗試用Scala重新實(shí)現(xiàn)。
可支持的標(biāo)準(zhǔn)協(xié)議:
- SET 存
- GET 取
- FLUSH_ALL 清理
- STATS 狀態(tài)
擴(kuò)展協(xié)議:
- SHUTDOWN 關(guān)閉kestrel server,如果執(zhí)行該操作,需強(qiáng)制重啟Kestrel
- RELOAD 動(dòng)態(tài)重新加載配置文件
- DUMP_CONFIG dump配置文件
- FLUSH queueName flush某個(gè)隊(duì)列
經(jīng)測(cè)試,支持 DELETE 協(xié)議!

PS: XMemcached-1.2 及其以上版本已對(duì)其協(xié)議完全支持,注意使用 KestrelCommandFactory 。

當(dāng)然, Redis 也可以做消息隊(duì)列,但 Redis 目前只是 Master-Slave 模式,還不能像 Kestrel 做到 Cluster 。所以,如果只是考慮隊(duì)列服務(wù),還是純粹一點(diǎn),直接用 Kestrel ,配合 XMemcached 作為客戶端,保持一致性哈希,用起來更放心。因?yàn)椋呖捎寐铮『呛牵?

想要消化Kestrel,需要做些準(zhǔn)備工作:
- kestrel,必須的!這里用 kestrel-2.1.7-SNAPSHOT.jar
- daemon,Linux守護(hù)進(jìn)程,這里用 daemon-0.6.4
本想Git下來,逐個(gè)編譯一把,但始終未果,只好找兄弟copy一份來運(yùn)行!

我會(huì)在附件中,追加相應(yīng)的配置文件,以及kestrel-2.1.5.jar。

如果你的Server還沒有安裝Daemon,參考如下操作:
- wget http://libslack.org/daemon/download/daemon- 0.6 . 4 .tar.gz
- tar zxvf daemon- 0.6 . 4 .tar.gz
- cd daemon- 0.6 . 4
- ./configure && make && make install
一、Kestrel目錄結(jié)構(gòu)
Kestrel目錄結(jié)構(gòu)如下:
Kestrel
|-kestrel-1.2.7-SNAPSHOT.jar
|-kestrel-1.2.7-SNAPSHOT.pom
|-config
|-development.conf
|-production.conf
|-libs
|-scripts
|-devel.sh
|-kestrel.sh
|-qdump.sh
libs中的jar列表:
- configgy-1.6.4.jar
- naggati_2.7.7-0.7.4.jar
- slf4j-jdk14-1.5.2.jar
- twitteractors_2.7.7-2.0.0.jar
- json-1.1.3.jar
- scala-library.jar
- specs-1.6.2.1.jar
- vscaladoc-1.1-md-3.jar
- mina-core-2.0.0-M6.jar
- slf4j-api-1.5.2.jar
- twitteractors-1.1.0.jar
- xrayspecs-1.0.7.jar
由于附件體積限制,可能需要另行下載(Maven是個(gè)好幫手!

我們只需要關(guān)注以下幾個(gè)文件:
適用于開發(fā)環(huán)境:
- script/devel.sh 用于驗(yàn)證服務(wù)配置是否可用
- config/development.conf 配合 devel.sh 進(jìn)行操作的配置文件
適用于生產(chǎn)環(huán)境:
- scripts/kestrel.sh 核心執(zhí)行文件
- config/production.conf 核心配置文件
二、Kestrel腳本&配置說明
這里將Kestrel安裝至 /opt/servers/kestrel 路徑下,你可能需要對(duì)應(yīng)修改路徑配置。
先說用于開發(fā)環(huán)境的腳本&配置文件:
devel.sh
引用
#!/bin/bash
APP_NAME="kestrel"
#應(yīng)用路徑
APP_PATH="/opt/servers/kestrel"
#版本
VERSION="1.2.7-SNAPSHOT"
echo "Starting kestrel in development mode..."
java -server -Xmx1024m -Dstage=development -jar $APP_PATH/$APP_NAME-$VERSION.jar
注意修改 APP_PATH !
development.conf
引用
# kestrel config for a production system
# where to listen for connections:
port = 22133
host = "0.0.0.0"
log {
#日志路徑
filename = "/var/logs/kestrel_development.log"
roll = "daily"
level = "info"
}
queue_path = "/var/spool/kestrel"
做一個(gè)簡(jiǎn)單的測(cè)試:
引用
./scripts/devel.sh
Starting kestrel in development mode...
Starting kestrel in development mode...
進(jìn)行如下操作:
引用
telnet localhost 22133
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
set x 0 0 5
12345
STORED
在另一個(gè)終端上獲得該消息:
引用
telnet localhost 22133
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
get x
VALUE x 0 5
12345
END
get x
END
如上操作,說明配置已成功。
如法炮制生產(chǎn)環(huán)境配置:
kestrel.sh
引用
APP_NAME="kestrel"
VERSION="1.2.7-SNAPSHOT"
#Kestrel路徑
APP_HOME="/opt/servers/$APP_NAME"
AS_USER="daemon"
DAEMON="/usr/local/bin/daemon"
QUEUE_PATH="/var/spool/kestrel"
HEAP_OPTS="-Xmx2048m -Xms1024m -XX:NewSize=256m"
JMX_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=22134 -Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false"
# add JMX_OPTS below if you want jmx support.
#如果需要控制字符集,使用-Dfile.encoding=UTF8
JAVA_OPTS="-server -verbosegc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintTenuringDistribution -XX:+
UseConcMarkSweepGC -XX:+UseParNewGC $HEAP_OPTS"
你可能需要修改APP_HOME變量
production.conf
引用
# kestrel config for a production system
# where to listen for connections:
port = 22133
#建議綁定主機(jī)IP
host = "0.0.0.0"
log {
filename = "/var/logs/kestrel.log"
roll = "daily"
level = "info"
}
#隊(duì)列存儲(chǔ)路徑,用于存儲(chǔ)/恢復(fù)隊(duì)列消息,建議存放在磁盤較大的區(qū)域
queue_path = "/var/spool/kestrel"
建議綁定 host ,確保服務(wù)器安全
可以重復(fù)上述測(cè)試操作,測(cè)試服務(wù)是否可用!

或者,直接查看服務(wù)狀態(tài)——STATS!

引用
telnet localhost 22133
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
stats
STAT uptime 52568
STAT time 1343093076
STAT version 1.2.7-SNAPSHOT
STAT curr_items 0
STAT total_items 1
STAT bytes 0
STAT curr_connections 1
STAT total_connections 9
STAT cmd_get 2
STAT cmd_set 1
STAT cmd_peek 0
STAT get_hits 1
STAT get_misses 1
STAT bytes_read 91
STAT bytes_written 151
STAT queue_test_items 0
STAT queue_test_bytes 0
STAT queue_test_total_items 1
STAT queue_test_logsize 27
STAT queue_test_expired_items 0
STAT queue_test_mem_items 0
STAT queue_test_mem_bytes 0
STAT queue_test_age 0
STAT queue_test_discarded 0
STAT queue_test_waiters 0
STAT queue_test_open_transactions 0
END
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
stats
STAT uptime 52568
STAT time 1343093076
STAT version 1.2.7-SNAPSHOT
STAT curr_items 0
STAT total_items 1
STAT bytes 0
STAT curr_connections 1
STAT total_connections 9
STAT cmd_get 2
STAT cmd_set 1
STAT cmd_peek 0
STAT get_hits 1
STAT get_misses 1
STAT bytes_read 91
STAT bytes_written 151
STAT queue_test_items 0
STAT queue_test_bytes 0
STAT queue_test_total_items 1
STAT queue_test_logsize 27
STAT queue_test_expired_items 0
STAT queue_test_mem_items 0
STAT queue_test_mem_bytes 0
STAT queue_test_age 0
STAT queue_test_discarded 0
STAT queue_test_waiters 0
STAT queue_test_open_transactions 0
END
最后,拷貝 kestrel.sh 文件到 /etc/init.d/ 路徑下,并賦予執(zhí)行權(quán)限:
- cp kestrel.sh /etc/init.d/kestrel
- chmod +x /etc/init.d/kestrel
后續(xù),我們就可以通過服務(wù)方式,調(diào)用kestrel了!

引用
service kestrel {start|stop|restart|status}
由于jar文件較大,未在附件內(nèi)上傳外,其余配置文件相見附件!

PS:重點(diǎn)說明一點(diǎn),隊(duì)列名稱/緩存鍵名稱,一定不要始終“-”作為連接符,請(qǐng)使用“_”作為連接符,避免意想不到的錯(cuò)誤。!
相關(guān)鏈接:
征服 Kestrel
征服 Kestrel + XMemcached
征服 Kestrel + XMemcached + Spring TaskExecutor
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
