JAVA面试系列(二)消息中间件

本人目前项目中有用到rocketMQ作为数据传输过程中的中间件,今天整理了一下资料,记录一下自己对消息中间件的理解。

一.概念

1.MQ

message queue消息队列,消息队列是就是队列,是一种先进先出的数据结构。把要传输的数据放在队列中,用队列机制来实现数据的传递,也就是生产者产生消息,将消息放入队列。消费者消费消息,将消息从队列中读出。

2.消息中间件

消息中间件是对消息队列的应用,消息队列(MQ)只是一种数据结构,而消息中间件是分布式系统中一个组件,或者说是一个系统。以上就是MQ和中间件的关系。

消息中间件是基于队列和消息传递技术的,在网络环境中为应用系统提供同步或异步、可靠的消息传输。

目前行业内主要的MQ产品有:RabbitMQ、ActiveMQ、RocketMQ、ZeroMQ、Kafka等等,我们项目用的是RocketMQ,项目是在我入职之前搭建的,有趣的是,当我问早起项目人员,为何我们选择rocketMQ时,他告诉我说因为集团云服务用的是阿里云,而阿里云用的是rocketMQ,我们肯定也就用rocketMQ。我一想,我擦,好有道理,我竟无法反驳。

二.面试问题点

1. 你们项目为什么要用到rocketMQ?

这个问题拆解以下,可以看作:什么是MQ?MQ由什么组成?又是怎么实现的?

什么是MQ前头讲过了,那么MQ的组成。

1.1 消息中间件的组成

broker 消息服务器,作为server提供消息核心服务

producer 生产者,业务的发起点,负责生产消息,并传输给到核心服务,也就是broker

consumer 消费者,业务的处理点,负责从broker获取到消息,并且对消息进行业务逻辑处理

queue 队列,点对点模式下,特定生产者向特定的队列发送消息,消费者订阅特定的队列来完成特定消息的获取

topic 主题,发布订阅模式下,不同生产者向topic发送消息,由MQ服务器分发到不同的订阅者,实现消息的广播

message 消息体,根据不同的通信协议定义的固定格式进行编码的数据包,用来封装业务数据,实现消息的传输

queuetopic我们可以看出来,MQ是有两种模式的,一种点对点,一种广播模式(发布模式)

1.2 消息中间件的两种模式

点对点:queue

A-------------------------------queue---------------------------------B

江湖规矩,单挑!此种模式下,生产者A发送消息到queue队列中,然后消费者B从queue队列中取出消费。这个消息被B消费了之后,queue将不再进行存储,也就是说,该消息只能由一个消费者消费,其他消费者不可能再消费得到。若果没有消费者来消费,则该消息就被一直保存直到有消费者来消费。

广播:topic

跟1对1不同,这是一个N对N,生产者将消息发布到topic中,同时会有多个消费者(订阅者)来消费该消息,严格来说,是所有订阅者。

2. 消息中间件给你们带来了什么?解决了什么问题?

这个问题就是问作用、实际使用业务场景。

2.1 消息中间件的作用

三大作用:异步、解耦、削峰

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java 中,我们可以使用 HttpClient 库来发送 HTTP 请求,并使用 HttpPost 类来发送 POST 请求。为了查看 POST 请求的报文,我们可以在发送请求之前,将请求体打印出来。示例代码如下: ```java import java.io.IOException; import org.apache.http.HttpEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; public class MyHttpClient { public static void main(String[] args) throws IOException { // 创建 HttpClient 实例 CloseableHttpClient httpClient = HttpClients.createDefault(); // 创建 HttpPost 请求 HttpPost httpPost = new HttpPost("http://localhost:8080/myServlet"); // 设置请求头 httpPost.setHeader("Content-Type", "application/json"); // 设置请求体 String requestBody = "{\"name\":\"Tom\",\"age\":18}"; StringEntity requestEntity = new StringEntity(requestBody); httpPost.setEntity(requestEntity); // 打印请求体 System.out.println("Request Body: " + requestBody); // 发送请求并获取响应 CloseableHttpResponse httpResponse = httpClient.execute(httpPost); // 处理响应 HttpEntity responseEntity = httpResponse.getEntity(); String responseBody = EntityUtils.toString(responseEntity); System.out.println("Response Body: " + responseBody); // 关闭资源 httpResponse.close(); httpClient.close(); } } ``` 上述代码中,我们使用 HttpClient 库创建了一个 HttpClient 实例,并创建了一个 HttpPost 请求。在设置完请求头和请求体之后,我们通过 System.out.println() 函数将请求体打印出来。当我们发送 POST 请求时,控制台会输出请求体,并打印响应体。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值