Skynet

          ---------- ---------- 我的新 blog : liukaiyi.cublog.cn ---------- ----------

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            112 Posts :: 1 Stories :: 49 Comments :: 0 Trackbacks

          常用鏈接

          留言簿(13)

          我參與的團隊

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜


          beanstalk 消息隊列 小結
          協議說明和各狀態轉換情況


          基本知識點:
            1. 對于beanstalk 消息隊列中每條數據都為 job
            2. beanstalk service端 ,會維護 tubes[多個管道]
            3. client端可以監聽,使用多 tube
            4. client端可以指定 use 管道[ client生成一個新的job時會把此job提交到 指定管道]
            5. client端可以指定 watch 管道 [ client接收處理job時會到 指定管道得到待處理的job]


          官方示意圖:
          put            reserve               delete
          -----> [READY] ---------> [RESERVED] --------> *poof*

          一般情況:
          1. 任務提交到service端,job 管理放入內存空間并為其標記狀態 [READY]
          2. client通過輪訓競爭得到次狀態, job 改為  [RESERVED]
             2.1 當在默認時間 120 秒內沒處理完 , job.stats.timeouts 就會大于 0
                同時其他 輪訓競爭client會拿到這個job【 注意了 每次timeouts時,在輪訓的客戶端就會得到次job,狀態都為 ready,timeouts>0 】
          3. 隨便其中一臺client處理完 job.delete   , 其他 client 中的此job 都會    *poof* 




          deom - python beanstalkc 中 job.stats 參考:
          使用 easy_install beanstalkc
          API 參考 : http://github.com/earl/beanstalkc/blob/master/TUTORIAL
          剛生成的 beanstalk
          {'buries': 0, 'releases': 0, 'tube': 'default', 'timeouts': 0, 'ttr': 120,
          'age': 6, 'pri': 2147483648L, 'delay': 0, 'state': 'reserved', 'time-left': 114,
          'kicks': 0, 'id': 2}

          以timeout了的 beanstalk,并且在其他client輪訓到 job
          {'buries': 0, 'releases': 0, 'tube': 'default', 'timeouts': 1, 'ttr': 120,
          'age': 417, 'pri': 2147483648L, 'delay': 0, 'state': 'reserved', 'time-left': 110,
          'kicks': 0, 'id': 2}
          {'buries': 0, 'releases': 0, 'tube': 'default', 'timeouts': 1, 'ttr': 120, 'age': 415,
          'pri': 2147483648L, 'delay': 0, 'state': 'reserved', 'time-left': 4294967163L,
          'kicks': 0, 'id': 2}

          當沒所有client 的 job 都到期 了 狀態
          {'buries': 0, 'releases': 0, 'tube': 'default', 'timeouts': 2, 'ttr': 120,
          'age': 417, 'pri': 2147483648L, 'delay': 0, 'state': 'ready', 'time-left': 4294967161L,
          'kicks': 0, 'id': 2}
          {'buries': 0, 'releases': 0, 'tube': 'default', 'timeouts': 2, 'ttr': 120, 'age': 415,
          'pri': 2147483648L, 'delay': 0, 'state': 'ready', 'time-left': 4294967163L,
          'kicks': 0, 'id': 2}

          其中 client1 job.delete
          client1 job.stats  *poof*
          client2 job.stats  *poof*







          比較全的狀態說明 - [官方文檔]
          http://github.com/kr/beanstalkd/blob/v1.1/doc/protocol.txt?raw=true

          官方示意圖:
           


          先簡單說明下(完全自己理解的,歡迎拍磚。本人E人太差~看官檔費勁,諒解下):
          job.stats狀態 = [READY] 待處理,  [RESERVED] 正處理, [DELAYED]延遲狀態 ,  [BURIED] 隱藏狀態

          1. 延遲提交
          py.client1.put>>> beanstalk.put('yes!', delay=10)
          py.client3.reserve>>> job = beanstalk.reserve()
          # 等待 10  秒

          2. 管道測試
          put-job到service端 可以指定 put的tube管道
          如:

          py.client1.put>>> beanstalk.use('foo')
          py.client1.put>>> beanstalk.put('hey!')

          py.client2.reserve>>> job = beanstalk.reserve()
          # 一直擁塞,應為 他 watch 管道 'default'

          py.client3.reserve>>> beanstalk.watch('foo')
          # beanstalk.ignore('bar') 放棄監聽 bar
          py.client3.reserve>>> job = beanstalk.reserve()
          py.client3.reserve>>> job.body #輸出 'hey!'



          3. 隱藏狀態 現在吧 client 1/2/3 的 use watch 的管道都調回 default
          py.client2.reserve>>> job = beanstalk.reserve()
          py.client3.reserve>>> job = beanstalk.reserve()
          py.client1.put>>> beanstalk.put('隱藏狀態!')
          py.client2.reserve>>> job.bury() #2 輪訓得到 并且 修改 job 為隱藏狀態
          # 120 秒后 client3 沒有輪訓得到 此job
          py.client2.reserve>>> job.stats()
          {'buries': 1, 'releases': 0, 'tube': 'default', 'timeouts': 0, 'ttr': 120,
          'age': 188, 'pri': 2147483648L, 'delay': 0, 'state': 'buried',
          'time-left': 4294967228L, 'kicks': 0, 'id': 11}
          py.client2.reserve>>> beanstalk.kick( job.stats()['id'] ) #修改狀態為 reserved
          # 立刻 client3 得到 job
          py.client3.reserve>>> job.stats()
          {'buries': 1, 'releases': 0, 'tube': 'default', 'timeouts': 0, 'ttr': 120, 'age': 313,
          'pri': 2147483648L, 'delay': 0, 'state': 'reserved',
          'time-left': 110, 'kicks': 1, 'id': 11}
          # 這時候 client2 / 3 同時 有 job 11 狀態 'buries': 1,'timeouts': 0,'state': 'reserved'

          4. peek 窺見
            可以得到 一個 stats - read 的 job ,其他 client 可以 job = beanstalk.reserve()
            后馬上 job.stats 會變成  [RESERVED]
            py.client2.reserve>>> job = beanstalk.peek_ready()
            取得 job 并看 本 client 能 處理能
          >>> job = beanstalk.peek(3)
          >>> job.body
              'yes!'
          >>> job.stats()['state']
              'ready'
          這種形式西 job 不能 bury 等修改狀態,但 可以 delete

          peek 系類
           peek_buried
           peek_ready










          整理 www.aygfsteel.com/Good-Game
          posted on 2009-10-30 12:05 劉凱毅 閱讀(3369) 評論(0)  編輯  收藏 所屬分類: python集群開發消息隊列
          主站蜘蛛池模板: 沂水县| 哈尔滨市| 亚东县| 奉化市| 肇州县| 固原市| 富顺县| 秀山| 达尔| 银川市| 安吉县| 奉新县| 郓城县| 新昌县| 青川县| 夏津县| 安吉县| 台北县| 同心县| 利川市| 建昌县| 镇巴县| 淳化县| 巨野县| 手游| 白水县| 海宁市| 韩城市| 崇仁县| 天津市| 济源市| 昌宁县| 杭锦后旗| 阳高县| 黄浦区| 五大连池市| 新泰市| 黔江区| 桑日县| 陇南市| 额敏县|