消息队列笔记

应用级应用程序,Java相关技术都是围绕着应用级应用程序。当下Java核心即是多线程+高并发+消息队列+异步! 技术是随着需求而产生的。2019.11.27

多线程/并发编程 2019.11.27

同步:即串行执行,同步锁:线程串行执行;常规表单提交:串行,用Ajax后:异步。

rpc:远程过程调用,用于进程间通信。

同步消息:消息/通知串行执行,

异步消息:消息/通知并行执行,效率高,消息队列的作用体现,

消息队列(远程队列)队列中为消息:

消息队列是一种中间件。

其实,消息队列还是使用了统一管理的理念。入队/出队必须同时执行,从而保持一致性。

入队/生产者/产品/发送消息/发布者

出队/消费者/接收(获取)消息/订阅者

有多个消费者,一条消息被多次消费,

订阅者持久化订阅,

生产者、消费者之间不依赖,

队列中的消息只有在被消费或者超时才会被销毁

2019.11.28

异步+消息队列=网速更快的假象;

异步:客户端不需要等待,

消息队列使用场景:

1.客户端不需要服务器的反馈,诸如此类的非核心流程使用消息队列以异步化处理是好的选择,

2.秒杀场景,用户一旦请求,请求消息写入消息队列,服务器读取消息队列以处理。首先入队的当然秒杀成功!这是队列先进先出的特性啊。秒杀功能还需要分布式锁技术。

消息模型

点对点消息模型:

qq或微信私聊就是点对点消息模型,每一条消息都仅有一个发送者,一个接收者,消息队列入队(发消息)出队(接收消息)机制保证了私聊安全性。

发布/订阅消息模型:

发布者发布消息,多个订阅者均可获取消息副本,

JMS(Java消息服务)

类似spring动态代理,同样有消息代理,

有jms模板(jmstemplate),它可以方便的发送/接收,入队/出队。

Spring还提供了消息驱动POJO的理念:这是一个简单的Java对象,它能够以异步的方式响应队列或主题上到达的消息。

Spring中如何集成实现JMS:

step1:搭建消息代理,消息代理用作客户端/服务端通信的中介,

ActiveMQ是一个伟大的开源消息代理产品,也是使用JMS进行异步消息传递的最佳选择,(消息代理产品还有Kafka等,中间件是自己写的,而Kafka是服务)。ActiveMQ是一个类似tomcat/maven的文件夹,对于大型分布式应用程序,这些maven、消息队列、数据库等当然都不是在同一台电脑上。在消息队列文件夹中可以找到启动该消息队列的脚本,启动即可;之后添加jar依赖;

step2:建立连接工厂,消息目的地,

连接工厂即消息队列软件,类似连接数据库的url、用户名、密码等,

消息目的地又分为 队列 和 主题 两种:队列是入队出队;主题是发布/订阅;

step3:使用jmstemplate,

为了消除冗余和重复的JMS代码,Spring 给出的解决方案就是JmsTemplate。JmsTemplate可以创建连接、获得会话以及发送和接收消息。这使得我们可以专注于构建要发送的消息或者处理接收到的消息。另外,JmsTemplate可以处理所有抛出的笨拙的JMSException异常。

发送消息:Java代码;接收消息:Java代码;

step4:创建消息监听器,

接收方法如receive()和receiveAndConvert()都是同步的,这些方法会一直被阻塞(阻塞就是不执行了),直到有消息发过来(这一点有点类似socket的发送和接收,发送消息时,接收消息的方法才会被调用执行),

如果一发送消息就能被对应的方法处理,那就好了——消息监听器,它在消息监听器容器中。

参考:

JMS:

https://blog.csdn.net/weixin_37352094/article/details/80500202

https://www.cnblogs.com/jmcui/p/8906803.html

什么是消息队列?https://blog.csdn.net/Java_3y/article/details/89235190

Kafka使用场景:https://blog.csdn.net/lp284558195/article/details/80271853

原文地址:https://www.cnblogs.com/yyjh/p/11947275.html