消息队列(11) - 通信协议的设计

这篇具有很好参考价值的文章主要介绍了消息队列(11) - 通信协议的设计。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

通信协议设计

对于我们客户端与服务器之间的通信协议我们约定如下:
消息队列(11) - 通信协议的设计,MQ消息队列,网络
具体的协议设计: 之后我们传递的参数也是这些
消息队列(11) - 通信协议的设计,MQ消息队列,网络

关于 type其实是在描述当前这个请求 、 响应是在调用那个API
约定如下
对于channel ,是tcp链接中的一个逻辑上的链接,一个TCP可以有多个Channel,存在的意义是为了让TCP得到复用, 毕竟一个TCP的链接代价挺大
消息队列(11) - 通信协议的设计,MQ消息队列,网络
对于客户端来说, 请求是调用一次以上的核心API告诉服务器,我要调用那个类,并传递过来相应的参数,
对于服务器来说 ,响应是给客户端返回这次调用的结果
消息队列(11) - 通信协议的设计,MQ消息队列,网络

代码实现

  1. 定义响应与请求类
package com.example.demo.Common;

import lombok.Data;

@Data
public class Request {
    private int type;
    private int length;
    private byte[] payload;// 对于请求来说 ,payload表示请求
}

package com.example.demo.Common;

import lombok.Data;
// 这个类表示一个响应, 也是根据自定义应用层协议来的
@Data
public class Response {
    private int type;
    private int length;
    private byte[] payload;// 对于响应来说,  payload是内容
}

  1. 首先我们创建所有类的父类 , 里面包含身份标识与channel身份标识,然后具体每个方法参数通过继承的方式来体现
package com.example.demo.Common;

import lombok.Data;

import java.io.Serializable;

/*
* 对于这个类表示 ,一些公共的参数 ,辅助字段
*/
@Data
public class BasicArguments  implements Serializable {
    // 表示 一次请求 / 响应的身份标识, 可以把请求和响应来对上
    protected String rid;
    // 这次通信使用的 channel 的身份标识(TCP 内部的链接)
    protected String channelId;
}

返回父类

package com.example.demo.Common;

import lombok.Data;

import java.io.Serializable;

/*
* 表示各个远程调用的方法的返回值的公共信息
*/
@Data
public class BasicReturns  implements Serializable {
    // 用来标识唯一的请求和响应
    protected String rid;
    // 用来标识一个 channel
    protected String channelId;
    //表示远程调用方法的返回值
    protected boolean ok;
}

3.根据虚拟主机中的方法,将每个方法所需要传递参数的类定义出来

交换机

package com.example.demo.Common;

import com.example.demo.mqServer.core.ExchangeType;
import lombok.Data;

import java.io.Serializable;
import java.util.Map;

@Data
public class ExchangeDeclareArguments extends  BasicArguments implements Serializable {
    private String exchangeName;
    private ExchangeType exchangeType;
    private boolean durable;
    private boolean autoDelete;
    private Map<String ,Object> arguments;

}

package com.example.demo.Common;

import lombok.Data;

import java.io.Serializable;
@Data
public class ExchangeDeleteArguments extends BasicArguments implements Serializable {
    private String exchangeName;

}


队列

package com.example.demo.Common;

import lombok.Data;

import java.io.Serializable;
@Data
public class QueueBindArguments extends BasicArguments implements Serializable {
    private String queueName;
    private String exchangeName;
    private String bindingKey;
}

package com.example.demo.Common;

import lombok.Data;

import java.io.Serializable;
import java.util.Map;
@Data
public class QueueDeclareArguments extends BasicArguments implements Serializable {
    private String queueName;
    private boolean durable;
    private boolean exclusive;
    private boolean autoDelete;
    private Map<String ,Object> arguments;
}

package com.example.demo.Common;

import lombok.Data;

import java.io.Serializable;
@Data
public class QueueDeleteArguments extends BasicArguments implements Serializable {
    private String queueName;
}

package com.example.demo.Common;

import lombok.Data;

import java.io.Serializable;
@Data
public class QueueUnbindArguments extends BasicArguments implements Serializable {
    private String queueName;
    private String exchangeName;

}

消息

package com.example.demo.Common;

import com.example.demo.mqServer.core.BasicProperties;
import lombok.Data;

import java.io.Serializable;
@Data
public class BasicPublishArguments extends BasicArguments implements Serializable {
    private String exchangeName;
    private String routingKey;
    private BasicProperties basicProperties;
    private byte[] body;

}

package com.example.demo.Common;

import lombok.Data;

import java.io.Serializable;
@Data
public class BasicConsumeArguments extends BasicArguments implements Serializable {
    private String consumerTag;
    private String queueName;
    private boolean autoAck;
    // 这个类对应的 basicConsume 方法中, 还有一个参数, 是回调函数. (如何来处理消息)
    // 这个回调函数, 是不能通过网络传输的.
    // 站在 broker server 这边, 针对消息的处理回调, 其实是统一的. (把消息返回给客户端)
    // 客户端这边收到消息之后, 再在客户端自己这边执行一个用户自定义的回调就行了.
    // 此时, 客户端也就不需要把自身的回调告诉给服务器了.
    // 这个类就不需要 consumer 成员了.
}

订阅消息文章来源地址https://www.toymoban.com/news/detail-643391.html

package com.example.demo.Common;

import com.example.demo.mqServer.core.BasicProperties;
import lombok.Data;

import java.io.Serializable;
@Data
public class SubScribeReturns extends BasicReturns implements Serializable {
    private String consumerTag;
    private BasicProperties basicProperties;
    private byte[] body;
}

到了这里,关于消息队列(11) - 通信协议的设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 消息队列(MQ)面试

    目录 讲一讲MQ 面试官: 在你之前的项目中,你是否使用过消息队列(MQ)?能详细介绍一下你在项目中如何使用MQ吗? 在用户和用户之间的多对多聊天通信中如何使用,请具体来讲一下。 那你可以讲一下消息的确认机制、消息重发机制吗,如何保证不出现消息丢失或者乱序的

    2024年02月09日
    浏览(37)
  • MQ-消息队列-RabbitMQ

    MQ(Message Queue) 消息队列 ,是基础数据结构中“ 先进先出 ”的一种 数据结构 。指把要传输的数据(消息)放在队列中,用队列机制来实现消息传递——生产者产生消息并把消息放入队列,然后由消费者去处理。消费者可以到指定队列拉取消息,或者订阅相应的队列,由

    2024年02月09日
    浏览(48)
  • 消息队列MQ

    MQ的原理可以简单概括为生产者将消息发送到队列中,消费者从队列中获取消息进行处理。具体来说,MQ的原理包括以下几个方面: 生产者:生产者将消息发送到MQ服务器中,消息可以是文本、对象、文件等形式。生产者可以使用API或者其他工具将消息发送到MQ服务器,同时可

    2024年02月03日
    浏览(38)
  • MQ消息队列(主要介绍RabbitMQ)

    消息队列概念:是在消息的传输过程中保存消息的容器。 作用:异步处理、应用解耦、流量控制..... RabbitMQ:     SpringBoot继承RabbitMQ步骤:         1.加入依赖          2.配置         3.开启(如果不需要监听消息也就是不消费就不需要该注解开启)         4.创建队列、

    2024年02月11日
    浏览(50)
  • MQ消息队列篇:三大MQ产品的必备面试种子题

    MQ(消息队列)是一种FIFO(先进先出)的数据结构,主要用于实现异步通信、削峰平谷和解耦等功能。它通过将生产者生成的消息发送到队列中,然后由消费者进行消费。这样,生产者和消费者之间就不存在直接的耦合关系。 其中,MQ的优势主要体现在以下几个方面: 异步通

    2024年02月14日
    浏览(40)
  • RaabitMQ(三) - RabbitMQ队列类型、死信消息与死信队列、懒队列、集群模式、MQ常见消息问题

    这是RabbitMQ最为经典的队列类型。在单机环境中,拥有比较高的消息可靠性。 经典队列可以选择是否持久化(Durability)以及是否自动删除(Auto delete)两个属性。 Durability有两个选项,Durable和Transient。 Durable表示队列会将消息保存到硬盘,这样消息的安全性更高。但是同时,由于需

    2024年02月14日
    浏览(168)
  • IM即时通讯开发MQ消息队列

    消息是互联网信息的一种表现形式,是人利用计算机进行信息传递的有效载体,比如即时通讯网坛友最熟悉的即时通讯消息就是其具体的表现形式之一。   消息从发送者到接收者的典型传递方式有两种:     1)一种我们可以称为即时消息:即消息从一端发出后(消息发送者

    2024年02月12日
    浏览(70)
  • 消息队列-RabbitMQ:MQ作用分类、RabbitMQ核心概念及消息生产消费调试

    1)什么是 MQ MQ (message queue),从字面意思上看, 本质是个队列,FIFO 先入先出 ,只不过队列中存放的内容是 message 而已,还是一种 跨进程的通信机制 , 用于上下游传递消息 。在互联网架构中,MQ 是一种非常常见的上下游 “ 逻辑解耦 + 物理解耦” 的消息通信服务 。 使用了

    2024年02月20日
    浏览(42)
  • .NetCore 使用 RabbitMQ (交换机/队列/消息持久化+mq高级特性+死信队列+延迟队列)

    目录 一、安装mq 二、实操 1、简单模式 2、工作模式 3、fanout扇形模式(发布订阅) 4、direct路由模式也叫定向模式 5、topic主题模式也叫通配符模式(路由模式的一种) 6、header 参数匹配模式 7、延时队列(插件方式实现) 参考资料: 1、我的环境是使用VMware安装的Centos7系统。MQ部署

    2023年04月09日
    浏览(99)
  • mq 消息队列 mqtt emqx ActiveMQ RabbitMQ RocketMQ

    十几年前,淘宝的notify,借鉴ActiveMQ。京东的ActiveMQ集群几百台,后面改成JMQ。 Linkedin的kafka,因为是scala,国内很多人不熟。淘宝的人把kafka用java写了一遍,取名metaq,后来再改名RocketMQ。 总的来说,三大原因,语言、潮流、生态。 MQ这种东西,当你的消息量不大的时候,用啥

    2024年02月12日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包