1.Hello World(直连):生产者发送消息到消息队列,消费者消费队列中的消息
2.Work(任务模型):让多个消费者绑定到一个队列,共同消费队列中的消息;
默认情况下rabbitmq按顺序将每个消息发送给下一个使用者,平均而言,每个消费者都会收到相同数量的消息,这种分发消息的方式称为循环;因为消息自动确认机制(autoAck : true)导致平均分配消息,这样会导致在消费消息时宕机导致数据丢失,所以关闭自动确认机制(autoAck : false),开启手动确认消息,且设置通道每次只能消费一个消息
3.Fanout(广播) :
在广播模式下,消息发送流程
4. Routing(路由):
在Fanout模式中,一条消息会被所有订阅的队列消费,但是,在某些场景下,我们希望不同的消息被不同的队列消费,这时就要用Direct类型的Exchange
5.Topics(动态路由):
Topic类型的Exchange与Direct相比,都是可以通过RoutingKey把消息路由到不同的队列。只不过Topic类型的Exchange可以让队列在绑定RoutingKey的时候使用通配符!这种模型RoutingKey一般都是由一个或多个单词组成,多个单词之间用 "," 分割
1.引入依赖
2.配置配置文件
3.发送/消费
发送
消费(临时队列)
1.异步处理:用户注册时,需要发送注册邮件和短信,串行和并行会导致增加客户等待时间,而引入消息队列后,把发送邮件,短信等不是必须的业务逻辑异步处理,提高了响应返回的时间。
2.应用解耦:双十一购物节,用户下单后,订单系统需要通知库存系统,传统做法是订单系统调用库存接口,但库存系统出现故障时,会导致订单失败。引用消息队列后,用户下单后,订单系统将消息写入消息队列,返回用户下单成功,库存系统订阅下单的消息,获取下单信息,进行库存操作,就算库存系统出现故障,也不会导致订单消息的丢失。
3.流量削峰:秒杀活动时,会因为流量过大导致应用挂掉,加入消息队列,可以控制活动人数,超过指定人数订单直接丢弃,同时,可以缓解段时间的高流量压垮应用。
1.普通集群
其他节点无法复制主节点消息队列,使用其他节点时会通过主节点去查询消息队列,但主节点宕机后,其他节点无法使用...
2.镜像集群
RabbitMQ有两种方式来解决这个问题:
1.事务的实现主要是对信道(Channel)的设置,主要的方法有三个:
2.Confirm的三种实现方式:
RabbitMQ有一个ACK机制。当消费者获取消息后,会向RabbitMQ发送回执ACK,告知消息已经被接收。不过这种回执ACK分两种情况:
自动ACK:消息一旦被接收,消费者自动发送ACK(默认)
手动ACK:消息接收后,不会发送ACK,需要手动调用
redis是可基于内存也可持久化的Key-Value数据库,其中value支持五种数据类型:
RDB:将内存中数据以快照的方式写入到二进制文件中,由于快照方式是在一定间隔时间做一次的,所以如果 redis 意外当机的话,就会丢失最后一次快照后的所有数据修改;
AOF:将每一个收到的写命令都通过 write 函数追加到文件中,当redis重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容
1.使用redis过期特性
下单时,订单状态是待支付。将订单编号作为key,下单的时间戳作为value,设置过期时间是30分钟。服务器监听redis的key过期事件,如果是订单过期(还会有其他key过期),则修改订单的状态为已取消。当30分钟后未支付则触发redis过期事件,只需修改订单状态即可。若30分钟内支付成功,则需要删除此订单在redis的值。当然,在支付时,需要检查订单是否已超时或已支付。
注意:由于存在多个键的过期,故必须对键进行判断,是否是订单超时造成的过期。
2.使用RabbitMQ的过期队列
RabbitMQ本身不支持延迟队列,可以使用存活时间ttl + 死信队列dlx实现消息延迟。发送的消息设置ttl,所在的队列不设置消费者。队列绑定死信队列,消息超时之后,变成死信消息,再发送给死信队列,最后发送给消费者。发送多条不同延迟时间消息,前面消息没有到延迟时间,会阻塞后面延迟更低的消息,因为队列有先进先出的特性。RabbitMQ的x-delay-message插件可以解决消息时序问题。带有ttl的消息发送x-delayed-message类型的交换机,消息不会直接路由到队列中。而且存储到分布式数据系统中,该系统会检测消息延迟时间。消息到达延迟时间,消息才能会投递到队列中,最后发送给消费者。
添加注解 @EnableRedisHttpSession,设置 Session 失效时间,当用户在系统A上登陆以后,假如后续的一些操作被负载均衡到系统B上面,避免用户重新登陆。
List 是一个双向链表,可以通过 lpush 和 rpop 写入和读取消息。不过最好使用RabbitMQ 等消息中间件。
1.概念
key 对应的数据在redis中并不存在,每次针对此 key的请求从缓存获取不到,请求转发到数据库,访问量大了可能压垮数据库。比如用一个不存在的用户 id 获取用户信息。
2.解决方案
1.概念
redis中的某个热门的key过期了,而此时客户端对这个key的访问量激增,redis无法命中,这些访问就会转发到数据库,造成数据库瞬间压力过大,
2.解决方案
1.概念
缓存雪崩针对很多 key 失效导致redis无法命中,数据库压力激增。
2.解决方案
一致性是指系统中各节点数据保持一致。分布式系统中,可以理解为多个节点中的数据是一致的。一致性根据严苛程度分类:
最终一致性:最终一致性是弱一致性的一个特例,最终一致性同样只保证数据写入成功后,在某个时间点后数据会达到一致。这个系统无法保证强一致性的时间片段被称为不一致窗口。不一致时间窗口的时间长短取决于很多因素,比如副本个数、网络延迟、系统负载等。最终一致性是弱一致性中非常受大众推崇的一种一致性模型,也是目前业界在大型分布式系统的数据一致性上比较推崇的模型。为保证缓存数据与数据库数据一致,主要考虑如下两种策略实现:
1.先删除缓存,再更新数据库;(可能存在A线程更新数据库失败导致B线程查询数据库读取到脏数据)
通过失败重试 + 延时双删,加入更新失败重试机制,降低数据不一致可能性;同时再更新成功后,延迟一段时间,再次删除缓存。
先更新数据库,再删除缓存;(可能存在A线程删除缓存失败导致B线程查询缓存读取到旧数据)
引入消息队列,若Redis删除缓存失败,则将Redis key放入消息队列,消费端监听消息队列并删除Redis直至删除成功。
需要注意的是上述描述的解决方案也只能保证最终数据一致性,无法保证强一致性。
开源的ElasticSearch是目前全文搜索引擎的首选。它可以快速地储存、搜索和分析海量数据。ES本质上是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个 ES实例。单个 ES实例称为一个节点(node)。
XXL-JOB是一个分布式任务调度平台, 平台架构分为调度器和执行器(就是你的业务程序), 调度器一般是一个单独的服务。
是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台,帮助我们发现、配置和管理微服务。
server向nacos发起注册任务请求,并维持一个心跳检测的定时任务,naocs会通过阻塞队列异步地处理这些请求,并实时的通过UDP推送到client,为防止UDP数据丢失,client也会通过定时任务每隔10s向nacos发送拉取请求,当服务列表改变,nacos再返回。
Nacos配置管理——配置共享_nacos 共享配置_杨 戬的博客-CSDN博客
Seata入门系列(27)-分布式事务之CAP、BASE理论_seata cap_云烟成雨TD的博客-CSDN博客
java 面试备战---分布式那点事
Docker容器_后端阿一的博客-CSDN博客
在子组件里定义一个props获取父组件的值,即props:[‘msg’]。
使用自定义事件,在子组件中使用this.$emit(‘myEvent’) 触发,然后在父组件中使用@myEvent监听
定义一个公共的事件总线eventBus,通过它作为中间桥梁,我们就可以传值给任意组件了。通过eventBus.$emit('事件名', 参数)发送消息,通过eventBus.$on('事件名', (参数) => {})监听消息
通过 ref= 的能力,给子组件定义一个ID,父组件通过这个ID可以直接访问子组件里面的方法和属性( this.$refs )
本文发布于:2024-01-31 23:50:02,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170671620232285.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |