tp消息队列之Job(失败)

1.什么是消息队列

我们可以把消息队列比作一个存放消息的容器,当我们需要消息的时候可以取出来供自已使用,消息队列是分布式系统中重要的组件,使用消息队列主要是为了通过异步处理提高系统性能和削峰、降低系统耦合性。

2.消息队列的优缺点

目前使用较多的消息队列有ActiveMQ,RabbitMQ,Kafka,RocketMQ,消息队列的特性,是一种先进先出的数据结构,所以消耗消息的时候也是按照1,2,3来消耗的,比如我们发送的时候是1,2,3,消耗的顺序也应该是1,2,3,但是偶尔也会出现顺序不对的情况,比如其中某一个消耗的时候失败或者一个queue多个consumer也会导致顺序不对,所以缺点也出现了

缺点:

1).何保证消息不被重复消耗

2).如何处理消息丢失的问题

所以说为什么至今消息队列没有专门的手册去说明,这表明消息队列本身还是有一定的问题

不过好处也是有的:

1).通过异步处理提高系统性能(削峰,减少响应时间)

2).降耦

3.实例说明图

在不使用消息队列的服务器时,用户的请求数据至今写入数据库,在高并发的情况下数据库压力剧增,使得响应时间变慢,但是在使用消息队列之后,用户的请求数据发送给消息队列之后立即返回,再由消息队列的消费者进程从消息队列获取数据,异步写入数据库,由于消息队列服务器处理速度快于数据库(消息队列也比数据库有更好的伸缩性),因此响应速度得到大幅改善。

消息队列具有很好的削峰作用的功能——即通过异步处理,将短时间高并发产生的事务消息存储在消息队列中,从而削平高峰期的并发事务。 举例:在电子商务一些秒杀、促销活动中,合理使用消息队列可以有效抵御促销活动刚开始大量订单涌入对系统的冲击。

因为用户请求数据写入消息队列之后就立即返回给用户了,但是请求数据在后续的业务校验、写数据库等操作中可能失败。因此使用消息队列进行异步处理之后,需要适当修改业务流程进行配合,比如用户在提交订单之后,订单数据写入消息队列,不能立即返回用户订单提交成功,需要在消息队列的订单消费者进程真正处理完该订单之后,甚至出库后,再通过电子邮件或短信通知用户订单成功,以免交易纠纷。这就类似我们平时手机订火车票和电影票。

另外为了避免消息队列服务器宕机造成消息丢失,会将成功发送到消息队列的消息存储在消息生产者服务器上,等消息真正被消费者服务器处理后才删除消息。在消息队列服务器宕机后,生产者服务器会选择分布式消息队列服务器集群中的其他服务器发布消息。

4.实战

composer require topthink/think-queue 2.0.4
如果不带版本号的话,是会报错的,会说框架版本要求tp6以上 
安装PHPMailer
composer require phpmailer/phpmailer

做完之后的感悟,其实tp框架对消息队列其实非常不友好的,这篇文章以失败而告终

赞赏

微信赞赏支付宝赞赏

255 次阅读量

发表评论