Por que as filas de mensagens são tão importantes?

Olá a todos, sou [Architecture Ferryman], um programador de dez anos. Este é o primeiro artigo da fila de mensagens. Esta série compartilhará com você muita experiência útil no trabalho prático. Se você tiver algum ganho, compartilhe com mais amigos.

Não sei se você já usou classes relacionadas a Queue, como ArrayBlockingQueue, DelayQueue e outras filas. Se você disser que nunca os usou ao escrever código comercial, na verdade é normal, mas na verdade você os usou indiretamente.

Por exemplo, o pool de threads, que todos devem ter usado, imagine que, se você continuar descartando tarefas no pool de threads, a política de rejeição será acionada quando a tarefa não puder ser descartada. Mas as tarefas no estágio inicial são todas enfileiradas para execução, então onde essas tarefas são armazenadas temporariamente? Esse contêiner temporário é a Fila.

Podemos ver se Queue é usado através do construtor de ThreadPoolExecutor. O código é o seguinte:

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

Pode-se ver que o papel da Fila é armazenar. Mas por que as pessoas raramente usam o Queue em Java diretamente no desenvolvimento de negócios, é porque o código de negócios envolve armazenamento de dados, e os dados do Queue estão todos na memória e não são persistentes, portanto, os cenários que podem ser usados ​​são relativamente limitados.

Embora essas filas não sejam usadas, geralmente usamos algum middleware de mensagens de código aberto, porque esses middlewares suportam persistência e são mais poderosos, mas, na verdade, são todos filas de mensagens e armazenamento temporário de dados.

Então, por que a fila de mensagens é tão importante ? Acho que o principal é que o sistema pode ser desacoplado e processado de forma assíncrona para melhorar o rendimento.

Desacoplamento entre sistemas

Suponha que você esteja fazendo um negócio de e-commerce, depois de fazer um pedido, você precisa enviar uma mensagem de texto para o usuário e precisa remover os dados do carrinho de compras. De acordo com a lógica normal, a interface do carrinho de compras e o serviço SMS é chamada na lógica de pedido, então equivale a confiar diretamente no SMS e no carrinho de compras.

Suponha que o serviço de carrinho de compras desligue e, em seguida, chamar a interface de remoção ao fazer um pedido inevitavelmente relatará um erro. O erro deve ser tratado ou não? Do ponto de vista comercial, esse erro não deve afetar o pedido, certo, mas isso fará com que os dados do carrinho de compras ainda existam após o pedido ser feito. Em seguida, é necessário processar solicitações anormais, como gravar um log, e depois realizar a pós-operação manualmente ou programar. Isso é problemático e aumenta a complexidade de toda a lógica.

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

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

异步处理,提升吞吐量

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

总结

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

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

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

Acho que você gosta

Origin juejin.im/post/7087399340913721352
Recomendado
Clasificación