<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ## 簡介 Beanstalk是一個高性能、輕量級的、分布式的、內存型的消息隊列系統。最初設計的目的是想通過后臺異步執行耗時的任務來降低高容量Web應用系統的頁面訪問延遲。其實Beanstalkd是典型的類Memcached設計,協議和使用方式都是同樣的風格。其基本設計思想很簡單:高性能離不開異步,異步離不開隊列,而內部都是生產者-消費者模式的 背景介紹:   現在市面上有很多消息隊列系統了。常用的有ActiveMQ, RabbitMQ,ZeroMA,Kafka,RocketMQ。Redis之父最近又開源了一個Disque。我之前在樂視用的是apache的qpid。但是之所以各個系統都在流行,還要看其側重點。   其中ActiveMQ可以稱之為傳統型,它們完全支持JMS和AMQP規范。 JMS即Java消息服務(Java Message Service)應用程序接口。它是Java平臺上有關面向消息中間件(Message Oriented Middleware,縮寫為MOM)的技術規范,它便于消息系統中的Java應用程序進行消息交換,并且通過提供標準的產生、發送、接收消息的接口簡化企業應用的開發。(*我這里說了,JMS是應用程序接口,就是API,API就意味著是和編程語言綁定的)   JMS的體系架構由JMS提供者、JMS客戶、JMS生產者、JMS消費者、JMS消息、JMS隊列、JMS主題組成。   JMS對象模型包含:連接工廠、JMS連接、JMS會話、JMS目的、JMS生產者和消費者和JMS消息。其中大家最關心的是JMS消息的兩種模型:點對點(point to point, queue)和發布/訂閱(publish/subscribe, topic)。這兩者之間的區別就是點對點模式是生產者發送一條消息到queue,一個queue可以有很多消費者,但是一個消息只能被一個消費者接收,當沒有消費者可用時,這個消息會被保存直到有一個可用的消費者,所以queue實現了一個可靠的負載均衡。而發布訂閱模式是發布者發送到topic的消息,只有訂閱了topic的訂閱者才會收到消息。topic實現了發布和訂閱,當你發布一個消息,所有訂閱這個topic的服務都能得到這個消息,所以從1到N個訂閱者都能得到這個消息的拷貝。      AMQP(高級消息隊列協議),和JMS的區別在于:JMS只是java平臺的方案,AMQP是一個跨語言的協議。由于跨語言的特點,降低了企業和系統集成的開銷。所以現在的消息隊列系統支持AMQP的多,支持JMS的少。   AMQP的特征是面向消息,隊列化,消息模型(和JMS一樣:點對點和發布訂閱),可靠性和安全性。它提供了三種消息傳遞保證方式:最多一次,至少一次和精確一次。   ## Beanstalk介紹:   那下面開始說beanstalk了。首先說beanstalk其實并不是JMS規范的,也并不嚴格遵守AMQP協議。有人說Beanstalk之于RabbitMQ,就好比Nginx之于Apache。它更簡單,輕量級,高性能,易使用。但是相比kafka,數據處理能力還是有差距,所以我們現在其實在逐漸替代它。但它有些很易用的特殊功能,后面會講到。   Beanstalk主要包括4個部分。   1> job:一個需要異步處理的任務,需要放在一個tube中。   2> tube:一個有名的任務隊列,用來存儲統一類型的job,是producer和consumer操作的對象。   3> producer:job的生產者,通過put命令來將一個job放到一個tube中。   4> consumer:job的消費者,通過reserve、release、bury、delete命令來獲取job或改變job的狀態。   剛才說Beanstalk有一些特殊的好用功能。那就是它支持任務優先級(priority)、延時(delay)、超時重發(time-to-run)和預留(buried),能夠很好的支持分布式的后臺任務和定時任務處理。這些特性是和beanstalk工作過程密切相關。   Beanstalk的一個job的生命周期有READY、RESERVED、DELAYED、BURIED四種。   當producer直接put一個job時,job就是READY狀態,等待consumer來處理。如果選擇延遲put,job就先到DELAYED狀態,到指定時間再READY。consumer獲取了READY的job,此狀態就為RESERVED。這樣其他consumer不能再操作此job。當consumer完成該job后,可以選擇delete、release或者bury。   delete之后,job不能再獲取。release的job可以重新遷移或延遲遷移回READY。bury的job可以被休眠,需要的時候再READY或者delete掉。 ## Beanstalk使用場景:   用作延時隊列:比如可以用于如果用戶30分鐘內不操作,任務關閉。   用作循環隊列:用release命令可以循環執行任務,比如可以做負載均衡任務分發。   用作兜底機制:比如一個請求有失敗的概率,可以用Beanstalk不斷重試,設定超時時間,時間內嘗試到成功為止。   用作定時任務:比如可以用于專門的后臺任務。   用作異步操作:這是所有消息隊列都最常用的,先將任務仍進去,順序執行。 Beanstalk隊列是輕量級的。 隊列的異步性 1. 優先級 2. 延遲 3. 持久化 4. 預留 5. 任務超時重發 ![](https://box.kancloud.cn/b9fb23e9e1f6536b80f38dca00551b59_1548x1300.jpeg) 安裝Beanstalk 安裝pheanstal擴展。 ## 消費類的寫法: ~~~ <?php $pheanstalk = require 'beanstalkd.php'; while(true){ $job = $pheanstalk->watch('newUsers')->reserve(); echo($job->getData()); //處理具體業務 $pheanstalk->delete($job); } ~~~ <span style="color:red;">消費類的寫法不是死循環,因為有reserve阻塞進程,隊列中沒有任務的時候會阻塞進程,不會造成無限循環</span>
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看