分布式:不同的业务模块部署在不同的服务器上或者同一个业务模块分拆多个子业务,部署在不同的服务器上,解决高并发的问题
集群:同一个业务部署在多台机器上,提高系统的高可用性
分布式是指将不同的业务分布在不同的地方。 而集群指的是将几台服务器集中在一起,实现同一业务。
分布式中的每一个节点,都可以做集群。 而集群并不一定就是分布式的。
分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数来提升效率
网站扩展性
扩展性是指对现有系统影响最小的情况下,系统功能可持续扩展或提升的能力。设计网站可扩展架构的核心思想是模块化,并在此基础上,降低模块间的耦合性,提供模块的复用性。模块通过分布式部署,独立的模块部署在独立的服务器上(集群)从物理上分离模块之间的耦合关系。模块分布式部署以后具体聚合方式主要有分布式消息队列和分布式服务。
- 利用分布式消息队列降低系统耦合性
如果模块之间不存在直接调用,那么新增模块或者修改模块对其他模块影响最小,这样系统的可扩展性无疑更好一些。
事件驱动框架:通过在低耦合的模块之间传输事件消息,以保持模块的松散耦合,并借助事件消息的通信完成模块间合作,典型的架构就是生产者消费者模式。在大型网站架构中,具体实现手段很多,最常用的就是分布式消息队列,如下图所示:
消息队列利用发布-订阅模式工作,消息发送者发布消息,一个或多个消息接收者订阅消息。由于消息发送者不需要等待消息接受者处理数据就可以返回,系统具有更好的响应延迟同时,在网站访问高峰,消息可以暂时存储在消息队列中等待处理,减轻数据库等后端存储的负载压力。
MQ的使用场景
1,在某个流程中,有一些逻辑必须执行,但并不需要立即执行的的场景。那么我们可以将这部分逻辑拆分出去,然后通过MQ触发执行。
2,某个业务场景中,出现一对多通知的时候时候。我们可以考虑使用MQ而不是遍历所有接收方。
例如:学生线上购买课程的流程,提交选课后会影响到:教师看到的学生名单、学生课表、学生行为记录、学生看到的结果短信、网站看到的课程订阅数量等等;
我们可以通过MQ约定channel_A, 当提交选课后,触发channel_A,所有订阅了channel_A的终端,都会并行的收到信息,并行处理相关的业务逻辑;
(当然上面的逻辑当然还有很多方式来实现,例如:通过多个线程;串行的发送异步消息。)
3、在做数据收集时有大量的数据请求过来时。
比如: 一个日志系统,需要收集各类日志,集中处理。因此是一个写操作比较多的业务,来自系统的各个日志有可能集中爆发,会把日志写入撑爆,有一种方案就是将各方的日志都先进到MQ中,来做缓冲,写操作根据能力来处理写操作,避免收集和写入的不对称。
这个场景类似于前端的列表更新,当有大量数据需要显示,前端可以分页加载,避免前端因为大量渲染而卡顿,这和MQ起到的是类似的作用。
那么总结一下,MQ能做什么?
1,将同步变异步
2,能做用来做消息分发
3,能够做消息的缓冲区
RabbitMQ的内部结构
RabbitMQ的内部结构的解释,如下表:
概率 |
---|
Producer |
生产者:消息发送者 |
Consumer |
消费者:消息接收者 |
Broker |
接收和分发消息的应用 |
virtual host |
一个broker中包含了多个virtual host,virtual host起到了隔离的作用,一个virtual有独立的exchange、binding、queue |
Exchange |
Producer 发送数据到exchange,exchange接收消息并将消息路由给服务器的queue |
Queue |
消息队列,用来存储message,消费者指定对应的queue进行消费 |
Binding |
将exchange和queue进行绑定,并制定路由的routingkey,生产者将消息传递给exchange,根据绑定的信息和路由routingkey将消息分发给queue |
Message |
它由消息头和消息体组成,消息体是不透明的,而消息头则有一些可选的属性组成。这些属性包括routing-key、priority、delevery-mode等 |
Retro
已经大致讲明了Rabbit的内部结构,以及作用。如果是实践感兴趣可以继续了解如何配置RabbitMQ,RabbitMQ的调用,优先级设置。
如果是一名前端Dev,我们也鼓励去尝试,不过我们需要回顾一下,MQ的作用、用途。
功能上,我们使用MQ来提供异步、数据缓冲。
架构上,例如微服务架构下实现进程间通信的一种方式:“傻瓜管道”(dumb pipes),使用RabbitMQ等提供可靠的异步机制。划定服务边界。