java面试—消息队列ActiveMQ

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Qizonghui/article/details/81545895

1.如何使用ActiveMq解决分布式事物
    在应用中,都会有用户注册功能:收集用户录入信息,保存到数据库—向用户的手机或邮箱发验证码······
    在传统集中式架构,实现功能:开启一个本地事物,往本地数据库中插入一条用户数据,发送验证码,提交事物。
    在分布式架构中,用户和发送验证码是两个独立的服务,他们都有各自的数据库,那么就不能通过本地事物保证操作的原子性,这时候我们需要用到mq来实现:在用户进行注册操作的时候,我们为该操作创造一条消息,当用户保存成功时,把这条消息发送到消息队列,验证码系统会监听消息,一旦接受到消息,就会给改用户发送验证吗。
    ##如何防止消息重复发送:增加消息状态表,通俗来说就是一个账本,用来记录消息的处理状态,每次处理消息之前,都去状态表中查询一次,如果已经有相同的消息存在,那么不处理,可以防止重复发送。
2.了解哪些消息队列
    ActiveMQ、RabbitMq、kafka
    RabbitMq:是Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP,SMTP,STOMP;适合企业开发,同时实现了broker架构,这就意味着消息在发送给客户端时现在中心队列排队,对路由,负载均衡或者数据持久化都有很好的支持。
    ActiveMQ:是apache下的一个子项目。类似于zeromq,能以代理人和点对点的技术实现队列。同时类似于RabbitMQ,少量的代码高效实现高级应用场景。
    Kafka/Jafka:apache下的一个子项目,一个高性能跨语言分布式发布/订阅消息队列系统,而jafka是在kafka上孵化来,kafka的一个升级版,具有:快速持久化,可以在O的系统开销下进行消息持久化;高吞吐;完全的分布式系统;支持Hadoop数据进行加载,
3.activeMq消息发送失败:
    ActiveMQ有两种通信方式,点到点形式和发布订阅模式。
    如果是点到点模式的话,如果消息发送不成功,此消息默认会保存到activemq服务端知道有消费者将其消费,所以此消息是不会丢失的。
    如果是发布订阅模式的通信方式,默认情况只通知一次,如果接受不到此消息就没有了,这种场景使用于对消息发送率要求不高的情况,如果要求消息必须送达不可以丢失的话,需要配置持久订阅。每个订阅端定义一个id,在订阅是向activemq注册,发布消息和接受消息时需要配置发送模式为持久化,此时如果客户端接受不到消息,消息会持久化到服务端,直到客户端正常接收后为止。
 

猜你喜欢

转载自blog.csdn.net/Qizonghui/article/details/81545895