<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>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 冪等生產者和事務生產者 * 消息交付可靠性保障 * i.e. Kafka 對 Producer 和 Cosumer 要處理的消息提供什么樣的承諾 * 常見承諾 * 最多一次(at most once):消息可能會丟失,但絕不會重復發送 * 至少一次(at least once):消息不會丟失,但可能重復發送 * 精確一次(exactly once):消息不會丟失,也不會重復發送 * Kafka 默認的可靠性保障為`至少一次` ## Kafka 的 exactly once * 通過以下兩個機制 * 冪等性(Idempotence) * 事務(Trannsaction) ## 冪等性 * 數學概念 * 某些操作或函數能夠被執行多次,但每次得到的結果都是不變的。 * CS 概念 * 在命令式 PL 中(e.g. C),若一個子程序是冪等的,那它必然不能修改系統狀態 * 在函數式 PL 中(e.g. Scala),純函數(pure function)天然冪等,不執行任何的 side effect * 冪等優勢 * 可以安全重試 ## 冪等性 Producer * Kafka 中 Producer 默認不冪等 * V0.11.0.0 之后 可以指定 Producer 的冪等性 * props.put("enable.idempotence", true) * Kafka 自動幫你做消息的去重 * 具體原理 * 利用空間換時間的優化思路 * 在 Broker 保存一些字段 * 當 Producer 發送了相同呢字段值的消息后,Broker 會在后臺將其丟棄 * 冪等性的作用范圍 * 只能保證單分區上的冪等性,i.e. 一個冪等性 Producer 能夠保證某個 Topic 的一個 Partitio 不出現重復消息 * 只能實現單會話上的冪等性,不能跨會話。i.e. 當重啟 Producer 則不保證冪等性 * 對于多分區 & 多會話上做消息無重復的做法:使用`事務` ## 事務 * Kafka 的事務概念類似數據庫領域的 ACID * 主要在 read committed 隔離級別上做事情 * read committed: 已提交讀。當讀取數據庫時,只能看到已提交的數據,即無臟讀。 ## 事務型 Producer * 保證消息原子性地寫入到多個分區中 * 不怕進程重啟 * 設置事務型 Producer * Producer 端參數:enable.idempotence = true * Producer 端參數:設置 transactional.id ``` Java producer.initTransactions(); try { producer.beginTransaction(); producer.send(record1); producer.send(record2); producer.commitTransaction(); } catch (KafkaException e) { producer.abortTransaction(); } ``` * Consumer 端讀取事務型 Producer 發送的消息也需要調整 * 設置 isolation.level 值 * read_uncommitted:默認值,一切都會讀。此處不合適。 * read_committed:Consumer 只會讀取 Producer 成功提交事務寫入的消息。 * 事務型 Producer 性能更差
                  <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>

                              哎呀哎呀视频在线观看