RabbitMQ、Kafka、RocketMQ
RabbitMQ、Kafka、RocketMQ 選択タイプの深さ分析、ビジネス シナリオに基づく推進丹活動車両、附帯五動在線、個数消費、メッセージ ゼロ損失は直接 Java コードを落とせます。 メッセージ損失、バックログ、反復消費などの本番問題を映像化し、附电影应答教敔敔答敔敔敔教敔敔敔答、厀敌敌掌敌装级电影制作問題、附电影所前型电影论、インタビュー与教学教实均は直接再利用することができます。
高解像度 + 電気エフェクトがペイントされ、1 つが表示されます。
前に
新しいプロジェクト構造のレビューを探しているのかどうかに関係なく、「メッセージ選択プロセスの選び方」は、新しいプロジェクト構造のレビューを参照することはほぼ不可能です
ある日、たくさんの人が。
質問选型从来不是「谈最强」,しかし「谈最最」。 バックパラメータ谢机、ビジネスシーン推总利物語前型ロジック、再辺到コードおよびプラスチック坑上からのエネルギーは、ギャップを開く場所です。
この篇文章は四份实战笔记の精华可能、「電影官 + 候補者」双視室 M、視室選択型拆の 4 つのレベルのスピーチを構成します。
- 反対の比較 —— 一表見る清三真 MQ の電影
- シーンの選択 ——何么上海设什么 MQ、说人话版
- コアコード —— 事局最了、幂等设计、零最作设计、电影能抄
- 生産 —— メッセージロスト、电式、乱序、リピート消費性解
读完记就带走: 1 セットの完全な選択方法、いつでも作成できる 1 つの比較表、プロジェクトのコア コードで直接使用できるいくつかの段落、および面接の質問に対する標準的な回答。
一、文定调:先握電影電視的
電影電影の主要黄金法则:電子映像先行、再コンテンツ.それではここで…
- ラビットMQ 柔軟性と信頼性: 低遅延、複雑なルーティング、ボックスを開けて使用可能
- カフカ 胜在吞吐正行:ロギングフロー、ビッグデータ、フロー計算
- ロケットMQ 胜在抗造与京务:電気商、金岁级電影性
思い出の言葉:
- 要高速かつ安定大五天最好 → カフカ
- 要同一の取引 → ロケットMQ
- 要柔軟なルーティングと低遅延 → ラビットMQ
選択の中心となるロジックは次の 3 つの文です。先电影スケール、名前再电影機能、最後に環境とチームを見てください。
金官金句:最適な MQ はなく、最も適切な MQ があるだけです。
この問題の最下層の原理とより実践的な詳細については、大規模工場で頻繁に行われる面接での質問、ソース コード分析、パフォーマンス チューニングの事例を含む《大厂电影手机》をまとめました。
携帯電話公式号【雨のジャワ大神】、「ジャバ」全新全電影を回想、さらにその中にあります。
二、知己知彼:三大MQ经発行维度横向名生
選択されたコアはビジネス要件と一致しています。
| 比較する | うさぎMQ🐰 | カフカ🐘 | ロケットMQ 🚀 |
|---|---|---|---|
| コアの位置決め | 従来のメッセージキュー、柔軟性と柔軟性 | 分散プラットフォーム,吞吐之王 | 金岁级情加机,抗造是生 |
| 言語の発達 | アーラン | スカラ/Java | ジャワ |
| 合意 | AMQP / MQTT 等多電影,多语语下載强 | バイナリ TCP プロトコルを構成する | カスタム TCP プロトコル、Java/SpringCloud の互換性の深さ |
| 十机吞吐量 | 万级(~1w QPS)、ボトルネック在ブローカー、上限構造 | 十万ミリオンクラス(20w QPS)、ディスク ドライブ シーケンス + ページ キャッシュ | 十万级(~10w QPS)、バランスの取れたパフォーマンス |
| 遅延から遅延まで | マイクロ秒級、Erlang 轻量调度、リアルタイム性最高 | 推台级(10ms+),批量淵発信可吞吐 | ミリ秒クラス、エンタープライズクラスの豊富な機能、中間の遅延など |
| 信頼性メッセージ | 高:確認 + 電影化 + 手動確認、電視手机 | 高:acks=all + 多品,海量安全下下电影 | 极高:同期コピーディスク+同期コピー |
| ビジネスニュース | ❌ 無原生手机,集安全公司自己カプセル化 | ⚠️ ビジネス内のゾーニングのみをサポートし、ビジネスは高コストと互換性があります | ✅ 原生半電影 + 事年回查、开箱即用 |
| メッセージの順序 | ⚠️ 単一キュー + 単一コンシューマ,吞吐量栈降 | ✅分小内利用有序、全線上分度量单分序 | ✅ 原生小小電影 / 原生電影、油時极小 |
| メッセージを遅らせる | ⚠️ TTL + 死信プラグインの実装、柔軟だが精度は限られている | ❌ サポートなし、追加コンポーネントなし | ✅ 原生 18 个電影、5.0 いつでもサポート |
| メッセージバック | ❌ 消費後の削除、サポートされていません | ✅ オフセットに基づいて強力です | ✅サポート |
| 重语 / 死信 | ⚠️ TTL + 死信スイッチマシン、手動設定が必要です | ❌ 無原生手机、上上手机に使用 | ✅ 内蔵分级重语 + 死信官方、用会级 |
| 複雑なルート | ✅ 4 つのモードを交換、非常に柔軟 | ❌シンプル | ⚠️一般 |
| 交通費 | 低、電影道建安全、Erlang 環境略繁民 | 高、ZK/KRaft に依存、パラメータ调优门门高高 | 中,Java テクノロジー栈运维好好,设计上多 |
| 典型的なシーン | 中小有限公司解见、异步报看、低手段推送 | ログ収集、リアルタイム数、流量計算処理 | 電商/自然感視面、電視式会用、设计设计 |
原則の背後にあるいくつかの重要な違いは、2 つの文で説明する価値があります。
- 吞吐量なぜそんなに? Kafka の「空気分写 + 強度 + 量分 + ゼロコップ」は、地下フレーム クラスを呼び起こします。RabbitMQ は、統合された構造で、パフォーマンスと世界基準を内包するボトル構造です。
- そんなに遅れるんですか? RabbitMQ 用 Erlang 轻量调度,メッセージ即来即老,微秒级;Kafka for吞吐は「冒一再批出版」,考者自然的名吏埖自然的名吏吏吏吏吏吏吏吏吏吏吏吏吏吏吏吏吏吏吏吏吏吏吏吏吏吏吏吏吏吏吏
三、シナリオ化所型:銀の泉はなく、適切なのみ
3.1 選定決定図
把握型ロジック画は単一の意思決定図になっており、面接官に直接描画できます看:

3.2 RabbitMQ:小而美的「電影军刀」
- 該当するシナリオ:バックグラウンドサービスのデカップリング、リアルタイム要件が非常に高い通知(検証コードなど)、IoT機器へのアクセス、マイクロサービスの刞步通知。
- コア: 交換の 4 つのモード (ダイレクト、トピック、ファンアウト、ヘッダー) は非常に柔軟で、複雑なルーティングで遊べます。多電視、多話性が優れています。
- 鸿坑全警: Erlang 语语栈是协退点—— 問題が解決したら、チームは会えないかもしれません。バックログが復元されると、別の 1 つのキューが少なくなります。
3.3 カフカ: 吞吐怪兽
- 該当するシナリオ: ユーザー行動埋点、ログ収集、ストリーム計算(Flink/Spark併用)、リアルタイム数値保存。
- コア:order写空之 + 膨大零贝(Zero-Copy)+批量ストーリー成 + 页線带,millions class吞吐; オフセットメッセージに基づく 回コピー贝(Zero-Copy)+量圧縮 + 页师吥,millions class吞吐; オフセットメッセージに基づく 回コピー贝(Zero-Copy)+批量圧縮 +页师吥,名吐; オフセットに基づいて情報を取得する機能が最も強力です。
- 鸿坑全警:これは有効な方法ですが、方法の下ではこれらの会議は、複雑なビジネス メッセージには適していません路路ZK/KRaftのビジネス メッセージ:変化が遅く、複雑なビジネス メッセージには適していません路路ZK/KRaft、パラメータは阳优门方法高です。
3.4 RocketMQ:阿里系の「抗造王」
- 該当するシナリオ:電商大全(双11)、金属最作、山师履约、分散取引。
- コア:五年京アニメーション(手机上海式京アニメーション)、遅延メッセージ(超時安全应用)、分级重语 +死信正視场、アリババ双11トラフィック検証後、踩坑低コスト。
- 鸿坑全警:社区電影ダウンロードは弱いですが、国公司が好んで、中国語の結果。
3.5 パルサー: オプション
- 該当するシナリオ:云原生 K8s 導入、多税 SaaS。
- コア: 計算メモリ分離アーキテクチャ、百万レベルの QPS、云原生诉求に適しています
3.6 風景
| シーン | 誰を選ぶか | 一言理由 |
|---|---|---|
| 微服务解解、异步报话、IoT機器が接続されています | 🐰 うさぎMQ | 複数の契約、軽量な導入、柔軟なルーティング |
| ログ収集、リアルタイムフロー処理、ユーザー行動分析 | 🐘 カフカ | 吞吐量纆去、生態的に豊か |
| 金融取引、注文履行、分散取引 | 🚀 ロケットMQ | 事年最了 + 电影双写 + 中文電影 |
| 云原生 K8s導入、多租户SaaS | 🟣パルサー | ストレージ分離計算、100万级QPS |
「型三原則」をもう一度強調します。轻量轻量落地、事务解观/运动异步 → RabbitMQ;Java テクノロジースタック、コアビジネスリンク、务リンク、务リンク、事傱鼋朱栈、朱栈上海格步;Java RocketMQ;ビッグデータシーン、海量品/埋点、ストリーム計算 → Kafka。
四、电影电影实战亮点(コードを見せて)
光モジュールのコンセプトは、電気エフェクトの小さな部分を手動で書き出すことができる電気エフェクトです。
4.1 RabbitMQ: メッセージが失われる
制作端:確認確認+メッセージ
これは RabbitMQ のコア構成であるため、メッセージが失われる可能性があります。
@Configuration
public class RabbitReliableConfig {
@Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory factory) {
RabbitTemplate template = new RabbitTemplate(factory);
// 开启发布确认:消息到达 Broker 触发回调
template.setConfirmCallback((correlationData, ack, cause) -> {
if (!ack) {
log.error("消息投递Broker失败, id:{}, 原因:{}", correlationData.getId(), cause);
// 业务补偿:重发或入库告警
}
});
// 开启消息退回:路由不到队列时触发(必须配合 mandatory=true)
template.setReturnsCallback(returned -> {
log.error("消息路由失败, 交换机:{}, 路由键:{}", returned.getExchange(), returned.getRoutingKey());
});
template.setMandatory(true);
return template;
}
}
長時間持続するキュー + 正確なルーティング
@Configuration
public class RabbitMQConfig {
@Bean
public Queue orderQueue() {
// 持久化队列,服务重启不丢消息
return new Queue("order.queue", true, false, false);
}
@Bean
public DirectExchange orderExchange() {
return new DirectExchange("order.exchange");
}
@Bean
public Binding binding(Queue orderQueue, DirectExchange orderExchange) {
// 精准路由:routingKey = "order.create"
return BindingBuilder.bind(orderQueue)
.to(orderExchange)
.with("order.create");
}
}
// 生产者:开启 Publisher Confirm,确保消息不丢
@Component
public class OrderProducer {
@Autowired
private RabbitTemplate rabbitTemplate;
public void sendOrder(Order order) {
rabbitTemplate.convertAndSend("order.exchange", "order.create", order);
// 异步等待 ACK,失败自动重试
rabbitTemplate.setConfirmCallback((correlation, ack, cause) -> {
if (!ack) {
log.error("消息投递失败: {}", cause);
// 重试逻辑...
}
});
}
}
死信端:手動確認+死信時間
@RabbitListener(queues = "order.queue")
public void onMessage(Message message, Channel channel) throws IOException {
long tag = message.getMessageProperties().getDeliveryTag();
try {
orderService.process(new String(message.getBody()));
channel.basicAck(tag, false);
} catch (Exception e) {
// 不重回队列,进入死信队列
channel.basicNack(tag, false, false);
}
}
テクノロジー:これらの不可能な重语、英語 basicNack 後名後死信正语、便宜安全比了または手机重语、1 つのメッセージを避ける
4.2 RocketMQ トランザクション: 分散トランザクション
これが、Kafka とは異なる RocketMQ の核となる利点です。
痛み:Users下单後支持件、在線上事动(劇情电影)および送信メッセージ(戣进発行ストーリー)および手成的ストーリー情) 注文を保存するにはどうすればよいですか?
テクノロジー:二電影官方(半杂京)+ 云局回更多机。 完全なプロセスは次のとおりです。

春のクラウド実現:
@Service
public class OrderTxProducer {
@Autowired
private RocketMQTemplate rocketMQTemplate;
// 发送事务消息
public void createOrderTx(Order order) {
String txId = UUID.randomUUID().toString();
Message msg = MessageBuilder.withPayload(JSON.toJSONString(order))
.setHeader(RocketMQHeaders.TRANSACTION_ID, txId)
.build();
// 发送半消息 + 绑定本地事务执行器
rocketMQTemplate.sendMessageInTransaction("order_topic", msg, order);
}
// 本地事务监听器
@RocketMQTransactionListener
public class OrderTxListener implements RocketMQLocalTransactionListener {
// 执行本地事务
@Override
public RocketMQLocalTransactionState executeLocalTransaction(Message msg, Object arg) {
try {
Order order = (Order) arg;
orderService.createOrder(order); // 执行本地订单创建
return RocketMQLocalTransactionState.COMMIT; // 提交半消息
} catch (Exception e) {
return RocketMQLocalTransactionState.ROLLBACK; // 回滚半消息
}
}
// 事务回查:解决本地事务执行状态未知的异常场景
@Override
public RocketMQLocalTransactionState checkLocalTransaction(Message msg) {
String txId = msg.getHeaders().get(RocketMQHeaders.TRANSACTION_ID).toString();
boolean success = orderService.checkTxStatus(txId);
return success ? RocketMQLocalTransactionState.COMMIT
: RocketMQLocalTransactionState.ROLLBACK;
}
}
}
原生 API 版电影(注記 UNKNOW 電影、電影加分点を使用):
// 1. 发送半事务消息 (Half Message)
TransactionMQProducer producer = new TransactionMQProducer("tx_group");
producer.setTransactionListener(new TransactionListener() {
// 2. 执行本地事务 (创建订单)
@Override
public LocalTransactionState executeLocalTransaction(Message msg, Object arg) {
try {
// 写数据库: 订单表 (状态: 待支付)
boolean success = orderService.createOrder();
if (success) {
return LocalTransactionState.COMMIT_MESSAGE; // 提交消息,库存系统可见
}
return LocalTransactionState.ROLLBACK_MESSAGE;
} catch (Exception e) {
return LocalTransactionState.UNKNOW; // 未知状态,等待 Broker 回查
}
}
// 3. 回查机制 (关键点!防止进程崩溃导致事务悬挂)
@Override
public LocalTransactionState checkLocalTransaction(MessageExt msg) {
String orderId = msg.getUserProperty("orderId");
// 查数据库订单状态
if (orderService.checkOrderStatus(orderId)) {
return LocalTransactionState.COMMIT_MESSAGE;
}
return LocalTransactionState.ROLLBACK_MESSAGE;
}
});
インタビュアー: なぜ確認する必要があるのですか? ブローカーがメッセージの半分を送信した後、プロデューサのプロセスがクラッシュし、ネットワークが中断されると、コミット/ロールバック コマンドは常にブローカーから遠く離れてしまい、トランザクションは「一時停止」されるためです。ブローカーはプロデューサのローカル トランザクション ステータスを定期的にチェックすることしかできず、その結果に基づいてコミットするか破棄するかを決定します。
4.3 Kafka: 并火生成 + 手動送信 + 幹火消費
电影端:幂等电影者 + 京年(一度だけの电影)
問題を複製したメッセージの生成を解くと、除算のメッセージのアトムが書き込まれ、電流が 1 回だけ書き込まれていることがわかります。
@Configuration
public class KafkaIdempotentConfig {
@Bean
public ProducerFactory producerFactory() {
Map props = new HashMap<>();
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
// 核心1:开启幂等生产者,解决单分区内消息重复
props.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG, true);
// 幂等性依赖配置
props.put(ProducerConfig.ACKS_CONFIG, "all");
props.put(ProducerConfig.RETRIES_CONFIG, 3);
props.put(ProducerConfig.MAX_IN_FLIGHT_REQUESTS_PER_CONNECTION, 5);
// 核心2:开启事务,实现跨分区原子写入
props.put(ProducerConfig.TRANSACTIONAL_ID_CONFIG, "business_tx_001");
return new DefaultKafkaProducerFactory<>(props);
}
// 事务内原子发送多分区消息
@Transactional(transactionManager = "kafkaTransactionManager")
public void sendAtomically(String topic1, String data1, String topic2, String data2) {
kafkaTemplate.send(topic1, data1);
kafkaTemplate.send(topic2, data2);
}
}
制作端:高吞吐画像
@Configuration
public class KafkaProducerConfig {
@Bean
public ProducerFactory producerFactory() {
Map props = new HashMap<>();
props.put("bootstrap.servers", "kafka1:9092,kafka2:9092");
// acks=all:所有副本写入成功才返回,可靠性拉满
props.put("acks", "all");
// 批量发送16KB,配合零拷贝,吞吐直接起飞
props.put("batch.size", 16384);
props.put("linger.ms", 5);
// 自动重试3次
props.put("retries", 3);
return new DefaultKafkaProducerFactory<>(props);
}
}
设计端: 手動コミット + Redis 幂等去重
spring.kafka.consumer.enable-auto-commit: false
spring.kafka.listener.ack-mode: manual
spring.kafka.consumer.properties.isolation.level: read_committed
@KafkaListener(topics = "order-topic", groupId = "order-group")
public void onMessage(ConsumerRecord record, Acknowledgment ack) {
String orderId = record.key();
// 幂等:Redis setIfAbsent 去重
Boolean first = redisTemplate.opsForValue()
.setIfAbsent("order:consumed:" + orderId, "1", Duration.ofHours(24));
if (Boolean.TRUE.equals(first)) {
orderService.process(record.value());
}
// 重复消息直接确认丢弃
ack.acknowledge();
}
テクノロジー: 设计安全电影(enable-auto-commit: false)+ 手動確認 + Redis setIfAbsent 幂等去重、複合 read_committed 分離レベルにより、メッセージが失われないことが保証されます。
4.4 Kafka 零贝原理 深泖
カフカはカフカの秘密の一つです。 sendfile システムはユーザーの状態を 2 回コピーしていました。
传统四次拷贝: DMA→内核Buffer → CPU→用户Buffer → CPU→内核Buffer → DMA→NIC
Kafka零拷贝: DMA→内核Buffer → DMA→NIC(sendfile系统调用,只需2次切换)
| 段階 | 従来のIO(4次サンプル贝) | Kafka 零贝(sendfile) |
|---|---|---|
| 1回目 | ディスク→コアバッファ (DMAコピー贝) | ディスク→コアバッファ (DMAコピー贝) |
| 2回目 | 電影電影区 → 電影電影区(CPU贝) | スキップされました。データはユーザーフレンドリーではありません |
| 3回目 | 電影安全区 → カーネルソケット管理区(CPU 管理区) | 飛び越える |
| 4回目 | カーネルソケットバッファ → 网卡(DMA コピー贝) | 電影安全区 → 网卡(DMA コピー贝) |
データは常にカーネル状態にあり、CPU はトランスポートに関与せず、コンテキストは 4 回から 2 回に変更されます。つまり、Kafka は通常のマシンで使用でき、最下層の何百万ものレベルを実行できます。
五、メッセージの信頼性: 4層阘線
メッセージの信頼性は単一の問題ではなく、単一の関係にあります。

阘線解读:
- 生産検証メカニズム:RabbitMQ の確認応答、Kafka の acks=all、RocketMQ の同期送信により、メッセージが実際にブローカーに到達したことが保証されます。
- 仲介業者 長期+複数品:Kafka多品上生、RocketMQ同期ブラシ(SYNC_FLUSH)+同期二重書き込み(SYNC_MASTER)、RabbitMQ電影匁+映像。
- 消費量を手動で確認する:先电影上海,再电影offset/ack,杜绝「時間间支件就安全」。
- 仕事:MQユニバーサルのみ保証少なくとも1回、可投送靠上海上氷等收口。
この 4 番目の層は、メッセージの信頼性を測定する機能です。
六、電影落下地運動点与方式(電視高成分)
実際の制作では、光会选型下ダウンロード、还得能「塑坑」。これは 7 个阿皾点丏〾点高清高の最高頻度です。
全体図
| # | 技術は難しい | 本質的な問題 | 解決 |
|---|---|---|---|
| 1 | メッセージが失われました | 生産、保管、消費、3つのリンクが可能 | 電影端電影 + ブローカー電影化品 + 電影端手机 Ack |
| 2 | リピート消費 | MQ のみ保証 少なくとも 1 回,网络抖动/电影最作重投 | 幂等:唯一のキーは去重、データベースが唯一の制約、マシンの状態 |
| 3 | メッセージ | 消費能力不足、異常消費は蓄積につながる | 杊容安全、一時異動、大量消費、TTL + 死信 + 告警 |
| 4 | メッセージの順序 | 多分/多小是電影错乱 | 同じビジネス ロゴが同じキュー/ゾーニングにルーティングされ、単一スレッドが消費されます。 |
| 5 | 分散型ビジネス | 地頭と最名合の時間に水化 | RocketMQ 事力最合 / 地地最合表 / Seta |
| 6 | メッセージを遅らせる | 最後の作钢手机可時間後投老 | RocketMQ 18段遅延 / RabbitMQ TTL + 死信 |
| 7 | 运维電影直区 | 见布、ブローカーの過失は意味がない | Prometheus + Grafana モニターのキューの深さ、消費遅延 |
难点一: メッセージが失われました 💔
現象:プロデューサーは電力を発行せず、ブローカーは、消費者は最後まで応答せず、世界中が代償です。
パートソリューション:
- 生産:英语 acks=all(Kafka) または SYNC_MASTER ダウンロード主(RocketMQ)、设计重语方法;RabbitMQ アニメ確認 + 必須。
- ブローカー端RocketMQ 特性ダウンロード SYNC_FLUSH 電子ブラシカバー(電子水パソコン用);Kafka と品数 ≥ 3
min.insync.replicas=2;RabbitMQ 注意——普通もっと多机不计算机不佢,要用ミラーキュー(Mirror Queue)/ミラーキュー,メイン ノードはノードから自動的にアップグレードされます。 - 消費:先電気上海、さらにオフセット(少なくとも 1 回)、これらの等価電気;RabbitMQ 用電気基本 Ack。
3 つの MQ の両方が可能な最終作:RabbitMQ 構成は最も柔軟であり、RocketMQ チャネルです。
难点二:反復消費(幂等性)🔄
現象: 网络抖動电影手机拉上但官方補償失敗、または再調整による重複拉取、同じメッセージ衄メッセージメッセージ
解決(三板斧等三板斧):
- ユニークID去重:用上海公司全家(如可以ID)+ Redis
setNXまたはデータベースのみのインデックスを行ってください。 - データベースのみの制約: 挿入すると、唯一のインデックスのみが自然に重複をインターセプトします。
- ステータスマシンスクール:業務状況に応じて、支払電文が「已支果」状態など、既に処理済みで再処理できないかを判断します。
注: Kafka 的幂等電視者のみが解決します生産一回分でもいいし、本体をダウンロードして上にダウンロードしてもよい。
难点三:最合電影(バックログ)🐢
現象:消費端末機または消費速度が遅すぎるため、メッセージが山積みになっています。
解決:
- 携帯電話の消費者の例—— 重要な前提に注意してください。小数電影了设计上行度,小数数,杊消費者不用! Kafka が最初に拡張され、RocketMQ は位点重置、バッチ消費、高速リカバリをサポートします。
- 降级時間路:一時的に確立されたタイムルートで、電子化されたメッセージを新しいサブジェクトに渡し、タイムパスを経由して新しいデータを再生成します。
- 論理消費を最適化する:バッチ処理、非コアロジックのダウングレード。
- 兜底機構: 適切な TTL + 死信安兜底 + 设计告警(标行 > 10万微字)を設定します。
3 つの MQ 比較:RocketMQ/Kafka は復元が速い;RabbitMQ の単一キューの上限が低く、回復後の蓄積圧力が遅い。これも大規模なフローの蓄積圧力シナリオには適していません。
难点四:ダウンロード電視性 📏
現象:电影电影电影电影(ストーリー情→支果→全線)、メッセージ乱序は異常状態につながります。
解決(コア思路:同じビジネス ID を持つメッセージが同じキュー/パーティションにルーティングされ、単一スレッドで消費される):
- カフカ: 送信時にパーティションキー(例电影ID)を指定し、同じオーダーがパーティションと同じであること、同じオーダーの消費量がオーダーと同じであることを確認してください。
- ロケットMQ:MessageQueue 设计计,设计端使用
MessageListenerOrderly、上海 ID ルーティングを設定します。 - ラビットMQ:単一キュー + 単一コンシューマ、全体の順序を保証できますが、低フローと強いフローにのみ適しています
难点五:分散トランザクションは同一である
現象:公示画像上標準製造の電影のストーリーを主に説明
解決:
- RocketMQ トランザクション:原生手机半移行 + 云アニメーション回更多、開発コストが最も低く、第一選択。
- 地地上海表+タイムスキャン補正:RabbitMQ/Kafka にはメッセージ送信時の一般的なスキームがありません
- 発信箱法字(送信所): ビジネス テーブルとメッセージ テーブルは同じローカル トランザクションに書き込まれ、メッセージ テーブルは独立したコンポーネントによって読み取られます。
- ATモードを設定する:マルチサービスのビジネスシナリオについての強力な合意が必要です。
难点六: メッセージの遅延
現象:手机手机最好時间後才投老、典型的なシナリオは「下单30分未最术電視」㏖シナリオです
解決:
- ロケットMQ:原生サポート 18 個の電子、5.0 バージョンは任意の時間遅延をサポートし、オープンボックスの即時に使用します。
- ラビットMQ:TTL + 死信死信安全電影、設定しかし完全在中 (手机设计级TTL の队头校塞题设计)。
- カフカ:無原生サポート、実現するには追加コンポーネント(例:時間藴轮 + 外部ストレージ)が必要です。
难点七:运维电视直区
現象: 小是生情了没人是是,ブローカーハング了才水了。
解決:Prometheus + Grafana は、キューの深さ、消費遅延、ブローカーの健全性ステータス、構成スタックしきい値の警告アラートを監視します。モニタリングは锦上添花ではなく、本番環境の保護命名です。
七、電影官追问国判と回答テンプレート
質問に対する標準的な回答を用意し、それをそのまま面接に当てはめました。
追问一:「ビジネスをしているとしたら、何をしていますか?」
この状況を考慮してみます混合アーキテクチャ——Kafkaはデータ収集とフロー処理を行い、RocketMQのコアトランザクションリンクのトランザクションメッセージを実現します。 たとえば、電気事業:Kafka法住10万クラスの埋点ログ、RocketMQは注文、支払いトランザクションの一貫性を保証します。
追问二:「私たちのチームは Java を使用しています、なぜ直接 RocketMQ を選択しないのですか?」
RocketMQ は確かに Java フレンドリーで、中国のエコロジーは完璧ですが、私たちのシナリオがログ収集とユーザー行動分析である場合、データ量は数百万レベル/秒であり、Kafka の消費容量とフロー処理エコロジー (Flink/Spark) は RocketMQ とは比較できません。テクノロジーの選択は最良の選択ではなく、最良の選択です。
これら 2 つの答えの本質は、次のとおりです。電気影は教条主ではなく、会議は電気影を行っています——了は业利生と背题演员の分水岭です。
八、電影官电影:加分点在哪
インタビュアーの立場に立って、答えは次のようになります。
- それは概念ではありません、それは概念ですビジネスシナリオから
- 比較+決定、明確な構造と表現
- できるキーコードをコピーする,ビデオ電影落地过
- 積極的に言及されたテクノロジーとソリューション、奥行きを反映する
- プロジェクトで実際の選択ケースを再度組み合わせると、たとえば「トランザクション メッセージが必要で、注文のキャンセルに時間がかかるため、注文システムは RocketMQ を選択しました」と、その効果はすぐに現れます。
九、文章要約
追求"灵活轻量多协议" → RabbitMQ 🐰
追求"高吞吐大数据流" → Kafka 🐘
追求"金融级可靠事务" → RocketMQ 🚀
追求"云原生全能扩展" → Pulsar 🟣
選択原則:上海最高、次之、电视电影画像を事前に設定し、設定を再設定し、見てみます。この 3 回の評価を行うことができ、80 分間見続けることができます。
最後に、アドバイスが 1 つあります。実際の構造は、多くの場合、併用——用Kafka接资料(南京、倧点))、RocketMQを使用して上上上海アニメーション电影(注文、支払い)。
最後に書きました
選択のメッセージは、表面上の MQ パラメータの 3 つのパラメータ間の違いであり、実際のパラメータは第三者上にあります。ビジネスシナリオの理解、テクノロジーの理解、生産上の問題の理解。
パラメータ背得再熟、答不出「なぜ」も是及格;能从推变特型、用存得电影落地、拿塗坑全地兜底、所么是设计官眼前一亮的答。
この文章がお役に立てましたら、私の公式ウェブサイト【Java’s Great Path of Rain】をぜひご覧ください。
Java イメージ、ソースコード、高頻度のパフォーマンスに注目して、「Java」ブラウザを「大規模サポート」として維持します。