返回文章列表

文章

Vert.x中的消息

Vert.x中消息的概念及特征用途

目录
  1. 1、什么是消息?
  2. 2、消息的典型形式
  3. 3、消息的传递模式
  4. 4、消息的生命周期
  5. 5、消息的典型用途
  6. 6、消息的序列化与编解码
  7. // 发送自定义对象 MyObject obj = new MyObject("data"); eventBus.send("custom.address", obj, new DeliveryOptions().setCodecName("mycodec")); ```
  8. 7、消息与事件循环(Event Loop)
  9. 8、消息与其他通信方式的对比
  10. 总结
  11. 📎 参考文章

1、什么是消息?#

消息是一个抽象出来的概念,其实就是一串数据的集合,专业术语就是结构化数据对象,Vert.x中消息有如下属性特征:

  • 地址(Address):消息的目标标识符,用于路由到正确的消费者(类似“频道”或“主题”)。
  • 主体(Body):实际传递的数据内容(如字符串、JSON、二进制数据等)。
  • 头信息(Headers):可选的元数据(键值对),用于传递附加信息(如消息类型、优先级等)。
  • 回复地址(Reply Address):用于实现请求-响应模式(发送方可以指定回复的目标地址)。

2、消息的典型形式#

Vert.x 支持多种数据类型作为消息的 body,例如:

  • 基本类型StringNumberBoolean
  • 结构化数据JSON 对象JSON 数组
  • 二进制数据Buffer(字节流)。
  • 自定义对象:通过编解码器(Codec)序列化的对象(如 Protobuf、POJO)。
// 发送一个 JSON 消息
JsonObject messageBody = new JsonObject()
    .put("userId", 123)
    .put("action", "login");
eventBus.send("user.events", messageBody);

// 发送二进制数据
Buffer buffer = Buffer.buffer().appendString("Hello Vert.x");
eventBus.send("data.channel", buffer);

3、消息的传递模式#

Vert.x 通过事件总线支持两种消息传递模式:

  1. 点对点(Point-to-Point)
    • 消息发送到特定地址后,仅有一个消费者(通过轮询负载均衡)会接收并处理该消息。
    • 适用于任务分发(如订单处理)。
  2. 发布-订阅(Publish-Subscribe)
    • 消息发送到特定地址后,所有订阅该地址的消费者都会收到该消息。
    • 适用于事件广播(如通知系统状态变更)。

4、消息的生命周期#

  1. 发送消息
    • 生产者调用 eventBus.send(address, body) 或 eventBus.publish(address, body)
    • 消息被放入事件总线的内部队列,等待调度。
  2. 路由消息
    • 事件总线根据 address 将消息分发给已注册的消费者。
    • 在集群模式下,消息可能跨节点传输。
  3. 处理消息
    • 消费者通过异步回调处理消息(例如:message -> { ... })。
    • 消费者可选择回复消息(通过 message.reply(responseBody))。

5、消息的典型用途#

  • 解耦服务:微服务间通过消息通信,避免直接依赖。

// 服务A发送请求 eventBus.request("serviceB.query", "request_data", reply -> { if (reply.succeeded()) { System.out.println("Response: " + reply.result().body()); } });

// 服务B处理请求并回复 eventBus.consumer("serviceB.query", message -> { String request = message.body(); String response = processRequest(request); message.reply(response); // 发送回复 }); ```

  • 事件驱动架构:触发异步事件(如用户注册成功后发送通知)。
  • 分布式系统:跨节点传递状态或指令(需配合集群模式)。

6、消息的序列化与编解码#

  • 默认支持类型:Vert.x 原生支持 StringBufferJsonObjectJsonArray
  • 自定义对象:需通过注册编解码器(Codec)实现序列化和反序列化。 java 复制

// 注册自定义编解码器(以 Java 对象为例) eventBus.registerCodec(new MyObjectCodec());

// 发送自定义对象 MyObject obj = new MyObject("data"); eventBus.send("custom.address", obj, new DeliveryOptions().setCodecName("mycodec")); ```#

7、消息与事件循环(Event Loop)#

  • 非阻塞处理:消息的发送和消费均由 Vert.x 的 Event Loop 线程驱动,确保异步特性。
  • 避免阻塞:消费者处理消息时,若涉及阻塞操作(如数据库查询),需切换到工作线程(executeBlocking)。

8、消息与其他通信方式的对比#

**特性****Vert.x 消息****HTTP 请求****传统消息队列(如 Kafka)**
**通信模型**异步、事件驱动同步(通常)异步
**耦合性**松耦合(通过地址路由)紧耦合(需知道端点)松耦合
**性能**高(无序列化/网络开销)中等高(但需外部中间件)
**适用场景**内部组件通信、微服务交互外部 API 调用大规模分布式系统

总结#

Vert.x 中的消息是一个轻量级、灵活的数据载体,通过事件总线实现异步通信。其核心特点包括:

  1. 通过地址路由,支持点对点和广播模式;
  2. 支持多种数据类型(包括自定义对象);
  3. 天然集成 Vert.x 的异步非阻塞模型;
  4. 适用于解耦组件、构建响应式系统或分布式服务。

📎 参考文章#