メッセージキューが非常に重要なのはなぜですか?

みなさん、こんにちは。10年のプログラマーである[ArchitectureFerryman]です。メッセージキューの最初の記事です。このシリーズでは、実際の作業で役立つ多くの経験を共有します。何かメリットがあれば、もっと多くの友達と共有してください。

ArrayBlockingQueue、DelayQueue、その他のキューなど、キュー関連のクラスを使用したことがあるかどうかはわかりません。ビジネスコードを書くときにこれらを使用したことがないと言う場合、それは実際には正常ですが、実際には間接的に使用しています。

たとえば、誰もが使用しているはずのスレッドプールで、タスクをスレッドプールにドロップし続けると、タスクをドロップできないときに拒否ポリシーがトリガーされることを想像してみてください。しかし、初期段階のタスクはすべて実行のためにキューに入れられているので、これらのタスクは一時的にどこに保存されますか?この一時コンテナはキューです。

QueueがThreadPoolExecutorのコンストラクターを介して使用されているかどうかを確認できます。コードは次のとおりです。

 public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              RejectedExecutionHandler handler) {
        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
             Executors.defaultThreadFactory(), handler);
}
复制代码

キューの役割は保存することであることがわかります。しかし、ビジネス開発でJavaのQueueを直接使用することはめったにありません。これは、ビジネスコードにデータストレージが含まれ、Queueのデータがすべてメモリ内にあり、永続的ではないため、使用できるシナリオが比較的限られているためです。

これらのキューは使用されませんが、これらのミドルウェアは永続性をサポートし、より強力であるため、オープンソースのメッセージミドルウェアを使用することがよくありますが、実際には、これらはすべてメッセージキューとデータ一時ストレージコンテナです。

では、なぜメッセージキューがそれほど重要なのですか?主なことは、システムを分離して非同期に処理し、スループットを向上させることができるということだと思います。

システム間のデカップリング

eコマースビジネスを行っているとします。注文後、ユーザーにテキストメッセージを送信し、ショッピングカート内のデータを削除する必要があります。通常のロジックによれば、ショッピングカートとSMSサービスのインターフェイスは注文ロジックで呼び出され、SMSとショッピングカートに直接依存するのと同じです。

ショッピングカートサービスがハングアップした場合、注文時にremoveインターフェイスを呼び出すと、必然的にエラーが報告されます。エラーを処理する必要がありますか、それとも処理しないでください。ビジネスの観点からは、このエラーは注文に影響を与えてはなりませんが、これにより、注文後もショッピングカートのデータが残ります。次に、ログの記録などの異常な要求を処理してから、手動またはプログラムで後処理を実行する必要があります。これは面倒で、ロジック全体の複雑さが増します。

如果我们引入了消息队列,那这件事情就简单多了。直接将要处理的动作,通过消息的形式告诉消息队列,只要告诉就完了,然后就可以告诉用户下单成功了。短信服务和购物车服务会去消费消息队列的消息,然后去执行对应的业务逻辑。我在下图中对于投递消息用的是虚线,目的是告诉大家,这块就解耦了。

假设购物车服务有几分钟挂了,那么等它重启正常后就会继续消费消息,然后把对应的数据移除,这里是最终一致性。

异步处理,提升吞吐量

这里就不贴图了,大家一看上面那张图就知道了。当下单完成后,消息投递之后,就立马返回了。而投递消息会非常快,因为不涉及到业务逻辑的处理。所以我们通过消息的形式,将一些不需要立马获得返回值的业务场景,进行了异步处理。同时下单的响应时间变短了,吞吐量自然就上来了。

总结

消息队列之所以在面试过程中必问,也是因为它是我们工作中不可缺少的一款中间件。正因为它的重要性,我们才更要去学习,要了解它的功能特点和使用场景,这样才能在工作中去解决具体的问题。

原创:架构摆渡人(公众号ID:jiagoubaiduren),欢迎分享,转载请保留出处。

本文已收录至学习网站 cxytiandi.com/ ,里面有Spring Boot, Spring Cloud,分库分表,微服务,面试等相关内容。

おすすめ

転載: juejin.im/post/7087399340913721352