1.生产者(Producer)
生产者是 Apache RocketMQ 系统中用来构建并传输消息到服务端的运行实体。生产者通常被集成在业务系统中,将业务消息按照要求封装成 Apache RocketMQ 的消息(Message)并发送至服务端
2.生产者的传输行为
传输行为 | 描述 |
---|---|
发送方式 | 生产者可通过API接口设置消息发送的方式。Apache RocketMQ 支持同步传输和异步传输 |
批量发送 | 生产者可通过API接口设置消息批量传输的方式。例如,批量发送的消息条数或消息大小 |
事务行为 | Apache RocketMQ 支持事务消息,对于事务消息需要生产者配合进行事务检查等行为保障事务的最终一致性 |
3.生产者和主题的关系
生产者和主题的关系为多对多关系,即同一个生产者可以向多个主题发送消息,同一个主题也可以接收多个生产者的消息
4.生产者的属性
(1)生产者客户端ID
生产者客户端的标识,用于区分不同的生产者。集群内全局唯一。客户端ID由Apache RocketMQ 的SDK自动生成,主要用于日志查看、问题定位等运维场景,不支持修改
(2)通信参数
参数 | 是否必选 | 作用 |
---|---|---|
接入点信息 | 是 | 连接服务端的接入地址,用于识别服务端集群 |
身份认证信息 | 否 | 客户端用于身份验证的凭证信息。 仅在服务端开启身份识别和认证时需要传输 |
请求超时时间 | 否 | 客户端网络请求调用的超时时间(默认值:3000ms) |
(3)预绑定主题列表
主题列表:Apache RocketMQ 的生产者需要将消息发送到的目标主题列表
消息类型 | 是否必须设置预绑定主题列表 | 作用 |
---|---|---|
事务消息 | 是(需要和事务检查器一起配合使用) | 事务消息场景下,生产者在故障、重启恢复时,需要检查事务消息的主题中是否有未提交的事务消息。避免生产者发送新消息后,主题中的旧事务消息一直处于未提交状态,造成业务延迟 |
非事务消息 | 否(建议设置) | 服务端会在生产者初始化时根据预绑定主题列表,检查目标主题的访问权限和合法性,而不需要等到应用启动后再检查。若未设置,或后续消息发送的目标主题动态变更, Apache RocketMQ 会对目标主题进行动态补充检验 |
(4)发送重试策略
Apache RocketMQ 客户端连接服务端发起消息发送请求时,可能会因为网络故障、服务异常等原因导致调用失败。为保证消息的可靠性, Apache RocketMQ 在客户端SDK中内置请求重试逻辑,尝试通过重试发送达到最终调用成功的效果。同步发送和异步发送模式均支持消息发送重试
1)重试机制触发条件
备注:对于事务消息,只会进行透明重试(transparent retries),网络超时或异常等场景不会进行重试
- 客户端消息发送请求调用失败或请求超时
- 网络异常造成连接失败或请求超时
- Apache RocketMQ服务端节点处于重启或下线等状态造成连接失败
- Apache RocketMQ服务端运行慢造成请求超时
- Apache RocketMQ服务端返回失败错误码:系统逻辑错误(因运行逻辑不正确造成的错误)和系统流控错误(因容量超限造成的流控错误)
2)重试流程
生产者在初始化时设置消息发送最大重试次数,当出现上述触发条件的场景时,生产者客户端会按照设置的重试次数一直重试发送消息,直到消息发送成功或达到最大重试次数重试结束,并在最后一次重试失败后返回调用错误响应
- 同步发送:调用线程会一直阻塞,直到某次重试成功或最终重试失败,抛出错误码和异常
- 异步发送:调用线程不会阻塞,但调用结果会通过异常事件或者成功事件返回
3)重试间隔
- 除服务端返回系统流控错误场景,其他触发条件触发重试后,均会立即进行重试,无等待间隔
- 若由于服务端返回流控错误触发重试,系统会按照指数退避策略进行延迟重试。指数退避算法通过以下参数控制重试行为
参数 | 描述 |
---|---|
INITIAL_BACKOFF | 第一次失败重试前后需等待多久,默认值:1秒 |
MULTIPLIERMULTIPLIER | 指数退避因子,即退避倍率,默认值:1.6 |
JITTER | 随机抖动因子,默认值:0.2 |
MAX_BACKOFF | 等待间隔时间上限,默认值:120秒 |
MIN_CONNECT_TIMEOUT | 最短重试间隔,默认值:20秒 |
4)功能约束
- 链路耗时阻塞评估:在重试流程中生产者仅能控制最大重试次数。若由于系统异常触发了SDK内置的重试逻辑,则服务端需要等待最终重试结果,可能会导致消息发送请求链路被阻塞。对于某些实时调用类场景,您需要合理评估每次调用请求的超时时间以及最大重试次数,避免影响全链路的耗时
- 最终异常兜底: Apache RocketMQ 客户端内置的发送请求重试机制并不能保证消息发送一定成功。当最终重试仍然失败时,业务方调用需要捕获异常,并做好冗余保护处理,避免消息发送结果不一致
- 消息重复问题:因远程调用的不确定性,当Apache RocketMQ客户端因请求超时触发消息发送重试流程,此时客户端无法感知服务端的处理结果,客户端进行的消息发送重试可能会产生消息重复问题,业务逻辑需要自行处理消息重复问题
5.生产者使用建议
(1)不建议单一进程创建大量生产者
Apache RocketMQ 的生产者和主题是多对多的关系,支持同一个生产者向多个主题发送消息。对于生产者的创建和初始化,建议遵循够用即可、最大化复用原则,如果有需要发送消息到多个主题的场景,无需为每个主题都创建一个生产者。
(2)不建议频繁创建和销毁生产者
Apache RocketMQ 的生产者是可以重复利用的底层资源,类似数据库的连接池。因此不需要在每次发送消息时动态创建生产者,且在发送结束后销毁生产者。这样频繁的创建销毁会在服务端产生大量短连接请求,严重影响系统性能。
标签:发送,Producer,生产者,重试,消息,Apache,RocketMQ From: https://blog.csdn.net/Lyhdreamer/article/details/136829007