<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之旅 廣告
                >[info] 冪等性 **什么是冪等性?** * 用戶對于同一操作發起的一次請求或者多次請求的結果是一致的 比如數據庫的樂觀鎖,在執行更新操作前,先去數據庫查詢version,然后執行更新語句,以version作為條件,如果執行更新時有其他人先更新了這張表的數據,那么這個條件就不生效了,也就不會執行操作了,通過這種樂觀鎖的機 制來保障冪等性 ***** **產生場景:** * 用戶注冊的時候手抖了多點擊了一次注冊,導致數據庫寫入2條數據。 ***** **場景代碼示例:basic_nack.php** ~~~ <?php /** * - Start this consumer in one window by calling: php demo/basic_nack.php * - Then on a separate window publish a message like this: php demo/amqp_publisher.php good * that message should be "ack'ed" * - Then publish a message like this: php demo/amqp_publisher.php bad * that message should be "nack'ed" */ include(__DIR__ . '/config.php'); use PhpAmqpLib\Connection\AMQPStreamConnection; use PhpAmqpLib\Exchange\AMQPExchangeType; $exchange = 'router'; $queue = 'msgs'; $consumerTag = 'consumer'; $connection = new AMQPStreamConnection(HOST, PORT, USER, PASS, VHOST); $channel = $connection->channel(); $channel->queue_declare($queue, false, true, false, false); $channel->exchange_declare($exchange, AMQPExchangeType::DIRECT, false, true, false); $channel->queue_bind($queue, $exchange); /** * @param \PhpAmqpLib\Message\AMQPMessage $message */ function process_message($message) { /* if(插入成功){ echo "將消息刪除:"; 服務器死掉,相當于exit; $message->ack(true); }else if(插入失敗){ echo "將消息不要刪除,等著下次消費"; $message->nack(true); }*/ if ($message->body == 'good') { $message->ack(); } else { echo "成功收到消息,消息內容為:".$message->body ; echo "將消息打回,重回隊列:"; $message->nack(true); } // Send a message with the string "quit" to cancel the consumer. if ($message->body === 'quit') { $message->getChannel()->basic_cancel($message->getConsumerTag()); } } $channel->basic_consume($queue, $consumerTag, false, false, false, false, 'process_message'); /** * @param \PhpAmqpLib\Channel\AMQPChannel $channel * @param \PhpAmqpLib\Connection\AbstractConnection $connection */ function shutdown($channel, $connection) { $channel->close(); $connection->close(); } register_shutdown_function('shutdown', $channel, $connection); // Loop as long as the channel has callbacks registered while ($channel->is_consuming()) { $channel->wait(); } ~~~ 1. 運行代碼監聽 如果監聽到 good 那就成功收到并處理 ![](https://img.kancloud.cn/83/90/839029a5747a1d36b537c161995431f2_403x73.png) 2. 在后臺往 msg 隊列 推送一條 good 消息 ![](https://img.kancloud.cn/22/94/2294abeed987ee006ca4072b31f1862c_863x508.png) 3. 隨便推送 ![](https://img.kancloud.cn/2a/a3/2aa3a29fd11a1e7c756be7c58e3374b3_479x159.png) ***** **什么是Con - 冪等性** * 在業務高峰期最容易產生消息重復消費問題,當Con消費完消息時,在給Pro返回ack時由于網絡中斷,導致Pro未收到確認信息,該條消息就會重新發送并被Con消費,但實際上該消費者已成功消費了該條消息,這就造成了重復消 費. * 而Con - 冪等性,即消息不會被多次消費,即使我們收到了很多一樣的消息. ***** **主流冪等性實現方案:** 1. 唯一ID+指紋碼 核心:利用數據庫主鍵去重 * 唯一ID:業務表的主鍵 * 指紋碼:為了區別每次正常操作的碼,每次操作時生成指紋碼;可以用時間戳+業務編號或者標志位(具體視業務場景而定) ![](https://img.kancloud.cn/1a/ee/1aeef246a5f20211602f22c211b6fd9c_1673x56.png) * 優勢 實現簡單 * 弊端 高并發下有數據庫寫入的性能瓶頸 * 解決方案 根據ID進行分庫分表算法路由 ***** **小結:** * 首先我們需要根據消息生成一個全局唯一ID,然后還需要加上一個指紋碼。這個指紋碼它并不一定是系統去生成的,而是一些外部的規則或者內部的業務規則去拼接,它的目的就是為了保障這次操作是絕對唯一的。 * 將ID + 指紋碼拼接好的值作為數據庫主鍵,就可以進行去重了。即在消費消息前呢,先去數據庫查詢這條消息的指紋碼標識是否存在,沒有就執行insert操作,如果有就代表已經被消費了,就不需要管了
                  <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>

                              哎呀哎呀视频在线观看