常见问题解答 (FAQ)
开启了 logActivity 选项,但控制台没有任何日志输出?
大部分 Vert.x 网络客户端与服务端配置项中都提供了 logActivity 开关,用于记录底层网络活动与数据包报文。
当该选项激活时,Netty 的流水线会通过 Netty 内部 Logger 以 DEBUG 级别输出日志。
因此,仅在代码中将 logActivity 设为 true 是不够的。
你还必须在项目的日志框架配置文件(如 Logback、Log4j2)中,将 io.netty.handler.logging.LoggingHandler 的日志级别显式设置为 DEBUG。
Vert.x 开启集群模式后,若某个节点崩溃宕机,Event Bus 上的消息会怎样?
当你向事件总线(Event Bus)发送一条消息时,消息会被直接投递到目标接收方节点,并在内存中缓冲直至处理完成。 该消息不会被持久化保存到磁盘或外部数据库中。
因此,若目标节点在消息处理完成之前发生崩溃宕机,该消息将会丢失。
如果你业务场景下无法容忍个别消息丢失,可以考虑以下几种应对方案:
- 当消息发送返回错误异常时,执行幂等性重试机制
- 采用异步确认机制(Asynchronous Acknowledgement)
如果需要严苛的消息可靠性保证,建议选用成熟的消息中间件系统,例如 Apache ActiveMQ 或 RabbitMQ。
Vert.x 生态为这些中间件提供了专用的响应式客户端支持:Vert.x AMQP Client、RabbitMQ Client for Vert.x 以及 Vert.x-Stomp。
为什么新建的 Event Bus 消费者无法消费到在此之前已经发送的历史消息?
当你向事件总线发布(Publish)一条消息时,该消息会被实时广播到当时已为该消息地址注册了消费者的所有节点。 消息不会在磁盘或数据库中留存。
因此,在现有节点上新创建的消费者,或者在消息发布后才加入集群的新节点,都无法接收到过往的历史消息。
如果你需要历史消息重放或离线消费能力,建议使用成熟的专业消息代理系统,如 Apache ActiveMQ 或 RabbitMQ。
Vert.x 针对这些方案提供了完善的客户端支持:Vert.x AMQP Client、RabbitMQ Client for Vert.x 以及 Vert.x-Stomp。
如何改用 JVM 内置的域名解析器?
在默认情况下,Vert.x 采用非阻塞异步域名解析器,而非直接使用 JVM 原生的同步解析器。 对绝大多数用户而言这一过程完全透明,但非阻塞异步解析器在某些特定小众网络环境下可能会偶发兼容性问题。
若遇到此类情况,欢迎在 Vert.x Core 仓库 Issue 列表 中向官方提交反馈。
作为临时规避方案,你可以关闭异步域名解析器,回退至 JVM 原生内置解析器。
只需在 JVM 启动参数中将系统属性 vertx.disableDnsResolver 设置为 true 即可:
-Dvertx.disableDnsResolver=true