Beanstalkd的使用(Golang)

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。最近需要引入一種新的訊息佇列,這個隊列最好有專業、簡單、訊息不丟失等特性,但又不會引入過多的複雜性,
 特別是在目前單槍匹馬的情況下。然後發現Beanstalkd看起來是我所需要的.
        Beanstalkd 支援任務優先順序 (priority), 延時 (delay), 逾時重發 (time-to-run) 和預留 (buried), 
 同時支援binlog.最後速度還可以。
 看了下源碼,c語言代碼量小而清晰.作者從07年維護到14年,Star也很高,品質應當是有保障的。
 隊列作者提供了Go用戶端,從作者項目列表中可以看到已經寫了不少Go相關的東西,看來Go很受後台開發的歡迎。

 Beanstalkd 首頁在這:  http://kr.github.io/beanstalkd

      寫了個調用例子如下. 

   

/*  xcl (2015-8-15)  多TubeName 多消費者*/package mainimport ("fmt""github.com/kr/beanstalk""runtime""strings""time")var (TubeName1 string = "channel1"TubeName2 string = "channel2")func Producer(fname, tubeName string) {if fname == "" || tubeName == "" {return}c, err := beanstalk.Dial("tcp", "127.0.0.1:11300")if err != nil {panic(err)}defer c.Close()c.Tube.Name = tubeNamec.TubeSet.Name[tubeName] = truefmt.Println(fname, " [Producer] tubeName:", tubeName, " c.Tube.Name:", c.Tube.Name)for i := 0; i < 5; i++ {msg := fmt.Sprintf("for %s %d", tubeName, i)c.Put([]byte(msg), 30, 0, 120*time.Second)fmt.Println(fname, " [Producer] beanstalk put body:", msg)//time.Sleep(1 * time.Second)}c.Close()fmt.Println("Producer() end.")}func Consumer(fname, tubeName string) {if fname == "" || tubeName == "" {return}c, err := beanstalk.Dial("tcp", "127.0.0.1:11300")if err != nil {panic(err)}defer c.Close()c.Tube.Name = tubeNamec.TubeSet.Name[tubeName] = truefmt.Println(fname, " [Consumer] tubeName:", tubeName, " c.Tube.Name:", c.Tube.Name)substr := "timeout"for {fmt.Println(fname, " [Consumer]///////////////////////// ")//從隊列中取出id, body, err := c.Reserve(1 * time.Second)if err != nil {if !strings.Contains(err.Error(), substr) {fmt.Println(fname, " [Consumer] [", c.Tube.Name, "] err:", err, " id:", id)}continue}fmt.Println(fname, " [Consumer] [", c.Tube.Name, "] job:", id, " body:", string(body))//從隊列中清掉err = c.Delete(id)if err != nil {fmt.Println(fname, " [Consumer] [", c.Tube.Name, "] Delete err:", err, " id:", id)} else {fmt.Println(fname, " [Consumer] [", c.Tube.Name, "] Successfully deleted. id:", id)}fmt.Println(fname, " [Consumer]/////////////////////////")//time.Sleep(1 * time.Second)}fmt.Println("Consumer() end. ")}func main() {runtime.GOMAXPROCS(runtime.NumCPU())go Producer("PA", TubeName1)go Producer("PB", TubeName2)go Consumer("CA", TubeName1)go Consumer("CB", TubeName2)time.Sleep(10 * time.Second)}/*運行結果:XCLdeiMac:src xcl$ clearXCLdeiMac:src xcl$ go run testmq.goCB  [Consumer] tubeName: channel2  c.Tube.Name: channel2CA  [Consumer] tubeName: channel1  c.Tube.Name: channel1CB  [Consumer]/////////////////////////CA  [Consumer]/////////////////////////PB  [Producer] tubeName: channel2  c.Tube.Name: channel2PA  [Producer] tubeName: channel1  c.Tube.Name: channel1PB  [Producer] beanstalk put body: for channel2 0PA  [Producer] beanstalk put body: for channel1 0CA  [Consumer] [ channel1 ] job: 47027  body: for channel1 0CB  [Consumer] [ channel2 ] job: 47026  body: for channel2 0PB  [Producer] beanstalk put body: for channel2 1PA  [Producer] beanstalk put body: for channel1 1CB  [Consumer] [ channel2 ] Successfully deleted. id: 47026CB  [Consumer]/////////////////////////CB  [Consumer]/////////////////////////CA  [Consumer] [ channel1 ] Successfully deleted. id: 47027CA  [Consumer]/////////////////////////CA  [Consumer]/////////////////////////CA  [Consumer] [ channel1 ] job: 47028  body: for channel1 1PA  [Producer] beanstalk put body: for channel1 2CB  [Consumer] [ channel2 ] job: 47029  body: for channel2 1PB  [Producer] beanstalk put body: for channel2 2PA  [Producer] beanstalk put body: for channel1 3CA  [Consumer] [ channel1 ] Successfully deleted. id: 47028CA  [Consumer]/////////////////////////CA  [Consumer]/////////////////////////CB  [Consumer] [ channel2 ] Successfully deleted. id: 47029PB  [Producer] beanstalk put body: for channel2 3CB  [Consumer]/////////////////////////CB  [Consumer]/////////////////////////PB  [Producer] beanstalk put body: for channel2 4CB  [Consumer] [ channel2 ] job: 47030  body: for channel2 2CA  [Consumer] [ channel1 ] job: 47031  body: for channel1 2PA  [Producer] beanstalk put body: for channel1 4Producer() end.Producer() end.CA  [Consumer] [ channel1 ] Successfully deleted. id: 47031CA  [Consumer]/////////////////////////CA  [Consumer]/////////////////////////CB  [Consumer] [ channel2 ] Successfully deleted. id: 47030CB  [Consumer]/////////////////////////CB  [Consumer]/////////////////////////CB  [Consumer] [ channel2 ] job: 47033  body: for channel2 3CA  [Consumer] [ channel1 ] job: 47032  body: for channel1 3CB  [Consumer] [ channel2 ] Successfully deleted. id: 47033CA  [Consumer] [ channel1 ] Successfully deleted. id: 47032CB  [Consumer]/////////////////////////CB  [Consumer]/////////////////////////CA  [Consumer]/////////////////////////CA  [Consumer]/////////////////////////CA  [Consumer] [ channel1 ] job: 47034  body: for channel1 4CB  [Consumer] [ channel2 ] job: 47035  body: for channel2 4CB  [Consumer] [ channel2 ] Successfully deleted. id: 47035CB  [Consumer]/////////////////////////CA  [Consumer] [ channel1 ] Successfully deleted. id: 47034CB  [Consumer]/////////////////////////XCLdeiMac:src xcl$*/
 可用beanstool來查看隊列狀態

 

也可以參考我寫下面兩段,來查。

ar, er := c.ListTubes()if er != nil {fmt.Println("[Example]  er:", er)} else {for i, v := range ar {fmt.Println("[Example] ListTubes  i:", i, " v:", v)c.Tube.Name = vid, body, err := c.Reserve(5 * time.Second)if err != nil {fmt.Println("[Example] err:", err, " name:", c.Tube.Name)continue} else {fmt.Println("[Example] job:", id)fmt.Println("[Example] body:", string(body))}}}func tubeStatus(c *beanstalk.Conn) {fmt.Println("[tubeStatus]/////////////////////////")fmt.Println("Tube(", c.Tube.Name, ") Stats:")m, er := c.Tube.Stats()if er != nil {fmt.Println("[tubeStatus] err:", er)} else {for k, v := range m {fmt.Println(k, " : ", v)}}fmt.Println("[tubeStatus]/////////////////////////")}
  從測試看,Beanstalkd 足以滿足我現在的需求了.

BLOG: http://blog.csdn.net/xcl168


著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.