メッセージを同期する方法との主な消費者の進捗状況をRocketMQ?

私はRocketMQはあなたとは別のルールについても記述していますが、マスターとスレーブサーバの消費進行の間、求めることができるようペースを維持する方法ですか?私はあなたがそれに答えるましょう。

消費者の支出パターンが異なる場合、OffsetStoreの進歩にニュース消費者の消費者の最後のセーブ保存するさまざまな方法があるでしょう、彼は、2つのカテゴリがあります実現しました。

進行状況を保存org.apache.rocketmq.client.consumer.store.LocalFileOffsetStore //ローカル消費が達成された進展を保存org.apache.rocketmq.client.consumer.store.RemoteBrokerOffsetStore //リモート消費を達成しました

これは、それが消費のモードを放送している場合は、進行状況メッセージの消費がローカルに保存され、それが消費パターンをクラスタ化されている場合は、進行状況メッセージの消費がブローカーに保存されているが、それがローカルに格納されているかどうか、またはブローカに保存され、地元の消費者になりますキャッシュを残すことは、私たちは、クラスタ消費パターンを見てみましょう、キャッシュメッセージの消費の進行状況は、保存する方法を次のとおりです。http://m.qd8.com.cn/yiyao/xinxi21_3710012.html

org.apache.rocketmq.client.consumer.store.RemoteBrokerOffsetStore#updateOffset:

公共のボイドupdateOffset(メッセージキューMQ、長いオフセット、ブールincreaseOnly){場合(MQ!= NULL){
    AtomicLong offsetOld = this.offsetTable.get(MQ)。IF(ヌル== offsetOld){
      offsetOld = this.offsetTable.putIfAbsent(MQ、新しいAtomicLong(オフセット));
    } {{(increaseOnly)IF(NULL!= offsetOld)場合
        MixAll.compareAndIncreaseOnly(offsetOld、オフセット)。
      }他{
        offsetOld.set(オフセット)。
      }
    }
  }
}

誰がメッセージにメッセージを消費し、上記メソッド呼び出し、offsetTableキャッシュ消費スケジュール、に話す負荷再バランスPullRequestオブジェクト抽出法を再配布する場合RemoteBrokerOffsetStore.readOffset消費スケジュールoffsetTableキャッシュバッファからの値を対応する呼び出し、この値は、その後、それは終わりを引っ張っキャッシュブローカー消費スケジュールメッセージにメッセージを送信することで、PullRequestオブジェクトを配置され、我々は、処理ロジックブローカーの終わりを見続けます。

プロセスを開始する前にブローカーを終えたとき、私は、時限タスクブローカーの開始を開くことが見つかりました:

org.apache.rocketmq.broker.BrokerController#初期化します。

this.scheduledExecutorService.scheduleAtFixedRate(新しいRunnableを(){@Override
    ます。public void実行(){{みてください
            BrokerController.this.slaveSynchronize.syncAll();
        }キャッチ(ThrowableをE){
            log.error( "ScheduledTask syncAllスレーブ例外"、E)。
        }
    }
}、* 10 1000 * 60 1000 TimeUnit.MILLISECONDS)。

ブローカーは、サーバからのものである場合、それは通常のタスクよりも多くを開きます。

org.apache.rocketmq.broker.slave.SlaveSynchronize#syncAll:

公共ボイドsyncAll(){this.syncTopicConfig()。this.syncConsumerOffset(); this.syncDelayOffset(); this.syncSubscriptionGroupConfig();
}

メインサーバにおいて、サーバ及び他の消費者の進捗からメインサーバー同期メッセージからのタイミング情報、ケースダウンしていない、今問題があるため、この同期化の場合にのみ、サーバマスターサーバから同期され、一方的に同期でありますプライマリサーバが起動している場合、消費者へのサーバがオーバー同期オフセットされていますから、プライマリサーバがダウンした後、消費者が消費するサーバからプルメッセージに切り替え、その後、それは消費者が同期を引き起こしたことを意味するのでしょうか?

実際には、消費者が消費ブローカーに進行するキャッシュ更新メッセージの消費者の消費の進行がある場合は、メッセージを引くのに時間がかかり、それが再起動した後、プライマリサーバがハングアップしているので、場合でも、個人消費は進行しませんでした失われ、マスタサーバが唯一の容器にリンクされているメインサーバーにまだ消費スケジュールメッセージ、このようにして、消費者側を更新し、再度メッセージが消費されることはありません、次のように、特定のコード・ロジックは次のとおりです。

org.apache.rocketmq.broker.processor.PullMessageProcessor#proce *** equest:

ブールstoreOffsetEnable = brokerAllowSuspend。
storeOffsetEnable = storeOffsetEnable && hasCommitOffsetFlag。
storeOffsetEnable = storeOffsetEnable
    && this.brokerController.getMessageStoreConfig().getBrokerRole() != BrokerRole.SLAVE;if (storeOffsetEnable) { this.brokerController.getConsumerOffsetManager().commitOffset(RemotingHelper.parseChannelRemoteAddr(channel), requestHeader.getConsumerGroup(), requestHeader.getTopic(), requestHeader.getQueueId(), requestHeader.getCommitOffset());
}

其中 brokerAllowSuspend 表示 broker 是否允许挂起,该值默认为 true,hasCommitOffsetFlag 表示息消费者在内存中是否缓存了消息消费进度,从代码逻辑可看出,如果 Broker 为主服务器,并且 brokerAllowSuspend 和 hasCommitOffsetFlag 都为true,那么就会将消费者消费进度更新到本地。焦作国医胃肠医院评价怎么样:http://jz.lieju.com/zhuankeyiyuan/37325143.htm


おすすめ

転載: blog.51cto.com/14510351/2451328