要用消息队列,总结起来就是六个字:解耦,异步,消峰。1)解耦传统模式下系统之间的耦合性太强。怎么说呢,举个例子:A系统通过接口调用向B、C、D三个系统发送数据。如果E系统接入或者以后不需要接入B系统,那么A系统还需要修改代码,非常麻烦。如果A系统产生了一个关键数据,那么它总要考虑如果B、C、D、E这四个系统都失效了怎么办?他们都收到了这条数据吗?显然,系统A与其他系统高度耦合。而如果我们往消息队列中写入数据(消息),需要消息的系统直接从消息队列本身消费。这样A系统就不用考虑向谁发送数据,不需要维护这段代码,也不需要考虑其他系统是否调用成功,失败超时等,反正我只负责为了生产,我不关心其他人。2)异步我们先来看传统同步的情况。例如:系统A收到一个用户请求,需要进行数据库写操作,同时也需要在B、C、D三个系统中进行相同的数据库写操作。如果A只需要1ms写入本地库,而B、C、D三个系统分别需要100ms、200ms、300ms写入库。最终请求的总延迟为1+100+200+300=601ms,大大降低了用户体验。如果使用消息队列,那么系统A只需要向消息队列发送3条消息。如果耗时5ms,则系统A从接收请求到返回响应给用户的总时间为1+5=6ms。对于用户而言,体验好感度直接满分。3)如果不使用缓存或消息队列进行消峰,系统直接基于数据库MySQL。如果有这样一个高峰期,大量的请求涌入MySQL,系统无疑会直接崩溃。那么如果我们使用消息队列,假设MySQL每秒最多可以处理1k条数据,高峰期瞬间有5k条数据涌入,但是这5k条数据涌入消息队列。这样我们的系统就可以根据数据库的能力慢慢的从消息队列中拉取请求,不要超过每秒可以处理的最大请求数。也就是说消息队列中每秒有5k个请求进来,1k个请求出去。假设高峰期是1小时,那么这段时间内消息队列中可能积压了几十万甚至上百万的请求。不过这个短暂的高峰期积压是完全可以的,因为高峰期过后,每秒不会有那么多请求进入消息队列,但是数据库还是会以每秒1k个请求的速度处理。所以一旦高峰期过去,系统就会快速处理积压的消息。
