您当前的位置:首页 > 生活 > 内容

消息队列实现(到底什么是消息队列Java中如何实现消息队列)

消息队列还包括消息有优先级、消息到达通知等丰富内容,消息队列,信号机制,管道之间的区别消息队列:用于消息,于是你就需要把写日志的请求放入到消息队列里,消息队列比管道高级多了,因为可能一个客户端有多个操作去写,到底什么是消息队列Java中如何实现消息队列消息队列,如何通过消息队列实现分布式事物我们从一个简单的实例入手. 基本所有互联网应用都会有用户注册的功能. 在这个例子中, 我们对于用户注册有两步操作: 1. 注册成功, 保存用户信息.2. 需要给用户发放一张代金券, 目的是鼓励用户进行消费.如果是一个单一架构应用, 实现这个功能非常简单: 在一个本地事务里, 往用户表插一条记录, 并且在代金券表里插一条记录, 提交事务就完成了. 但是如果我们的应用是用微服务实现的, 可能用户和代金券是两个独立的服务, 他们有各自的应用和数据库, 那么就没有办法简单的使用本地事务来保证操作的原子性了. 现在来看看如何使用事件机制和消息队列来实现这个需求.(我在这里使用的消息队列是kafka, 原理同样适用于ActiveMQ/RabbitMQ等其他队列)我们会为用户注册这个操作创建一个事件, 该事件就叫做用户创建事件(USER_CREATED). 用户服务成功保存用户记录后, 会发送用户创建事件到消息队列, 代金券服务会监听用户创建事件, 一旦接收到该事件, 代金券服务就会在自己的数据库中为该用户创建一张代金券. 好了, 这些步骤看起来都相当的简单直观, 但是怎么保证事务的原子性呢? 考虑下面这两个场景:1. 用户服务在保存用户记录, 还没来得及向消息队列发送消息之前就宕机了. 怎么保证用户创建事件一定发送到消息队列了?2. 代金券服务接收到用户创建事件, 还没来得及处理事件就宕机了. 重新启动之后如何消费之前的用户创建事件?这两个问题的本质是: 如何让操作数据库和操作消息队列这两个操作成为一个原子操作. 不考虑2PC, 这里我们可以通过事件表来解决这个问题. 下面是类图. EventPublish是记录待发布事件的表. 其中:id: 每个事件在创建的时候都会生成一个全局唯一ID, 例如UUID.status: 事件状态, 枚举类型. 现在只有两个状态: 待发布(NEW), 已发布(PUBLISHED).payload: 事件内容. 这里我们会将事件内容转成json存到这个字段里.eventType: 事件类型, 枚举类型. 每个事件都会有一个类型, 比如我们之前提到的创建用户USER_CREATED就是一个事件类型.EventProcess是用来记录待处理的事件. 字段与EventPublish基本相同.我们首先看看事件的发布过程. 下面是用户服务发布用户创建事件的顺序图. 1. 用户服务在接收到用户请求后开启事务, 在用户表创建一条用户记录, 并且在EventPublish表创建一条status为NEW的记录, payload记录的是事件内容, 提交事务.2. 用户服务中的定时器首先开启事务, 然后查询EventPublish是否有status为NEW的记录, 查询到记录之后, 拿到payload信息, 将消息发布到kafka中对应的topic.发送成功之后, 修改数据库中EventPublish的status为PUBLISHED, 提交事务.,FIFO可任何两个进程间通信了。

到底什么是消息队列Java中如何实现消息队列

消息队列,顾名思义首先是个队列。队列的操作有入队和出队也就是你有一个程序在产生内容然后入队(生产者)另一个程序读取内容,内容出队(消费者)这是最最基本的概念。我想你应该是缺乏一个使用场景。当你不需要立即获得结果,但是并发量又不能无限大的时候,差不多就是你需要使用消息队列的时候。比如你写日志,因为可能一个客户端有多个操作去写,又有很多个客户端,显然并发不能无穷大,于是你就需要把写日志的请求放入到消息队列里,在消费者那边依次把队列中产生的日志写到数据库里。至于怎么实现消息队列,其实你本身一个普通的队列就行呀~看你需要什么附加功能而已。

消息队列,信号机制,管道之间的区别

消息队列:用于消息,不是简单的数据信息传递,消息队列还包括消息有优先级、消息到达通知等丰富内容。信号机制:进程间事件通知的场合使用,比如进程A完成了某业务,通知进程B去干什么,达到了沟通的目的。当然仅仅传递了信号没有丰富的信息传递,不过现在传递信号也可附带数据了。管道:低级的通信机制,消息队列比管道高级多了,管道分PIPE和FIFO,PIPE是无名的,所以只能在进程内或父子进程间通信,FIFO可任何两个进程间通信了。不过这两个依然比较低级,完成高级的应用服务器还需要消息队列等。扩充:早期unix只有PIPE、FIFO、信号,后来开发了消息队列、信号量、共享内存。希望能帮到你~

什么是优先队列

优先队列(priority queue)普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高进先出 (largest-in,first-out)的行为特征。

如何通过消息队列实现分布式事物

我们从一个简单的实例入手. 基本所有互联网应用都会有用户注册的功能. 在这个例子中, 我们对于用户注册有两步操作: 1. 注册成功, 保存用户信息.2. 需要给用户发放一张代金券, 目的是鼓励用户进行消费.如果是一个单一架构应用, 实现这个功能非常简单: 在一个本地事务里, 往用户表插一条记录, 并且在代金券表里插一条记录, 提交事务就完成了. 但是如果我们的应用是用微服务实现的, 可能用户和代金券是两个独立的服务, 他们有各自的应用和数据库, 那么就没有办法简单的使用本地事务来保证操作的原子性了. 现在来看看如何使用事件机制和消息队列来实现这个需求.(我在这里使用的消息队列是kafka, 原理同样适用于ActiveMQ/RabbitMQ等其他队列)我们会为用户注册这个操作创建一个事件, 该事件就叫做用户创建事件(USER_CREATED). 用户服务成功保存用户记录后, 会发送用户创建事件到消息队列, 代金券服务会监听用户创建事件, 一旦接收到该事件, 代金券服务就会在自己的数据库中为该用户创建一张代金券. 好了, 这些步骤看起来都相当的简单直观, 但是怎么保证事务的原子性呢? 考虑下面这两个场景:1. 用户服务在保存用户记录, 还没来得及向消息队列发送消息之前就宕机了. 怎么保证用户创建事件一定发送到消息队列了?2. 代金券服务接收到用户创建事件, 还没来得及处理事件就宕机了. 重新启动之后如何消费之前的用户创建事件?这两个问题的本质是: 如何让操作数据库和操作消息队列这两个操作成为一个原子操作. 不考虑2PC, 这里我们可以通过事件表来解决这个问题. 下面是类图. EventPublish是记录待发布事件的表. 其中:id: 每个事件在创建的时候都会生成一个全局唯一ID, 例如UUID.status: 事件状态, 枚举类型. 现在只有两个状态: 待发布(NEW), 已发布(PUBLISHED).payload: 事件内容. 这里我们会将事件内容转成json存到这个字段里.eventType: 事件类型, 枚举类型. 每个事件都会有一个类型, 比如我们之前提到的创建用户USER_CREATED就是一个事件类型.EventProcess是用来记录待处理的事件. 字段与EventPublish基本相同.我们首先看看事件的发布过程. 下面是用户服务发布用户创建事件的顺序图. 1. 用户服务在接收到用户请求后开启事务, 在用户表创建一条用户记录, 并且在EventPublish表创建一条status为NEW的记录, payload记录的是事件内容, 提交事务.2. 用户服务中的定时器首先开启事务, 然后查询EventPublish是否有status为NEW的记录, 查询到记录之后, 拿到payload信息, 将消息发布到kafka中对应的topic.发送成功之后, 修改数据库中EventPublish的status为PUBLISHED, 提交事务.


声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,谢谢。

上一篇: 陈皮荷叶的功效与作用及食用 *** (陈皮荷叶的功效与作用及食用 *** 禁忌)

下一篇: 业务助理工作心得总结



推荐阅读

网站内容来自网络,如有侵权请联系我们,立即删除! | 软文发布 | 粤ICP备2021106084号