<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Skynet

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

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

    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










    整理 m.tkk7.com/Good-Game
    posted on 2009-10-30 12:05 劉凱毅 閱讀(3364) 評論(0)  編輯  收藏 所屬分類: python集群開發消息隊列
    主站蜘蛛池模板: 亚洲性色成人av天堂| 四虎国产精品成人免费久久| 四虎成人免费观看在线网址| 色噜噜狠狠色综合免费视频| 国产亚洲人成网站观看| 国产精品怡红院永久免费| 猫咪免费人成网站在线观看入口| 久久亚洲精品中文字幕三区| 大地资源在线观看免费高清| 狠狠躁狠狠爱免费视频无码| 亚洲五月综合网色九月色| 亚洲国产精品日韩| h视频在线观看免费网站| 污污的视频在线免费观看| 亚洲日本国产乱码va在线观看| 免费一看一级毛片人| 亚洲高清免费在线观看| 黄色三级三级三级免费看| 亚洲日产2021三区在线 | 日本一道在线日本一道高清不卡免费| 精品一区二区三区免费观看 | 免费一级不卡毛片| 日韩国产精品亚洲а∨天堂免| 亚洲国产人成网站在线电影动漫 | 毛片免费全部播放一级| 你懂的免费在线观看网站| 亚洲av综合日韩| 亚洲制服丝袜精品久久| 亚洲人成人77777网站| 国产成人3p视频免费观看 | 亚洲免费视频一区二区三区| 国产免费看JIZZ视频| 国产免费拔擦拔擦8X高清在线人 | 狠狠色香婷婷久久亚洲精品| 国产l精品国产亚洲区在线观看| 国产成人涩涩涩视频在线观看免费| 免费无码又爽又刺激高潮视频| 窝窝影视午夜看片免费| 亚洲色偷偷综合亚洲AV伊人蜜桃| 亚洲最大成人网色| 亚洲成AV人片在线观看|