• 张申傲
    2023-07-05 来自北京
    【重试机制】也可以参考下spring-retry框架(仅针对Java的同学),个人认为设计地比较完善,里面的maxAttempts、backoff、RetryCallback等机制都是具有通用性的~ https://github.com/spring-projects/spring-retry

    作者回复: 是的,非常好~ 这块都是通用的。 大家理解了设计原理,就自然可以看到在很多知名组件里面都是这么玩的。

    
    4
  • cykuo
    2023-07-06 来自北京
    回答一下思考题目,大方向上可以从功能上拆分为最基本的消息生产,消息消费,连接创建,连接管理。在消息重试机制上要考虑消息生产和消息消费ack机制,在消息批量发送上要考虑消息打包和拆包,以及生产之前的编码和消费消息后的解码,,,要考虑的真的好多,感觉做一个生产可用的企业级消息中间件太了不起了

    作者回复: 是的,要考虑的东西非常多,所以需要有一个系统的了解。可以根据本节的内容,尝试再细化一下这个答案,比如画个思维导图,梳理有哪些模块,如何选型,如何实现等等

    
    
  • aoe
    2023-07-05 来自浙江
    对「服务端内部转发机制」相对于「Metadata 寻址机制」多了一次转发的思考: 1. 导致成倍消耗资源(内存、网络带宽),不适合大流量、高吞吐场景 2. 增加了消息丢失的风险 3. 「计算目标节点」对 CPU 的消耗并没有增加,只是从「客户端」转移到了「服务端」,没有优化的空间

    作者回复: 1. 是的 2. 我个人理解应该还好,转发失败就是写入失败,客户端是有感知的,此时重新发送就可以。此时只要写入成功,数据应该不会丢失。 3. 是的, 主要成本在于客户端SDK的寻址模块的开发成本

    
    
  • 文敦复
    2023-07-05 来自四川
    为了保证元数据的即时性,可以采用下面2种方式。 1. 定期更新 2. 请求出错时更新 对于第2种,是不是意味着如果出错后的更新还没有找到分区信息就属于就属于不可恢复异常了?

    作者回复: 是不是意味着如果出错后的更新还没有找到分区信息就属于就属于不可恢复异常了? --------- 在实际实现上,找不到分区会直接定义为”可重试异常“,然后不停的重试。这样的好处是: 1. 如果一开始topic不存在,然后配合服务端自动创建topic,只要服务端有了topic,客户端业务就自动恢复正常了 2. 如果Leader 切换,也可能在一段时间内会报这个异常,一直重试,可以解决这种leader切换的场景。 3. 在一些其他的场景,只要客户端不断重试,只要客户端分区存在了,客户端就会立即恢复正常,不需要客户端手动去处理。 整体下来,总结好处就是客户端不会报错,会自动恢复,显得更加友好。

    
    
  • 文敦复
    2023-07-05 来自四川
    请教下老师,这个地方不太清楚,文章提到:“因为单个 TCP 连接发送性能存在上限,我们就需要在客户端启动多个生产者,提高并发读写的能力。一般情况下,每个生产者会有一个唯一的 ID 或唯一标识来标识客户端,比如 ProduceID 或客户端的 IP+Port。” 这里的“客户端”指什么?我的理解其并不是一个物理上的客户端节点吧,而是整个客户端组?

    作者回复: 客户端是指我们自己的业务应用,我们用来调用消息队列的服务的应用。 比如订单服务,它需要使用到RocketMQ,此时就需要在订单服务创建多个生产者,以提高写入/消费的性能。 此时,客户端就是指我们的业务应用。

    共 2 条评论
    
  • Geek_f31639
    2023-07-05 来自上海
    不知道专栏会不会给出一个简单mq实现的代码例子?

    作者回复: 有这个诉求的同学蛮多的,我自己后面有这个计划。可以加课程的微信群沟通交流哈。 当前这门课你可以理解是一个技术选型,方案设计的过程,在结课的时候技术方案就设计完成了。 接下来就是实操去写一个简单的MQ了。

    共 2 条评论
    
  • 奔腾ing
    2023-08-14 来自浙江
    老师,我们选型是rabbitmq,我目前基于开源的librabbitmq-cpp封装了一层,如果业务方之做生产者,在开启心跳功能后,发现rabbitmq不认sdk回复心跳的ack消息,从网络抓包看sdk都是有回复ack消息的,不过rabbitmq每次发送的心跳中ack字段都是1,过一会,rabbitmq日志中会打印因心跳超时断掉连接的情况。如果业务方做消费者,就不会有这个问题。目前的处理思路是,sdk内部在连接上rabbitmq后,主动起一个线程去发送心跳帧。不太明白,为啥rabbitmq会不认,生产者回复的心跳ack消息。
    
    
  • 特修斯之船
    2023-07-19 来自广东
    "需要 Server 主动发出检测包,此时如果客户端异常,可能出现很多不可用的 TCP 连接。" 这一句,怎么感觉理由不够充分呢,服务器等一下不也是知道客户端异常了吗,真的需要因为这理由让应用层去再做一层心跳吗?
    
    
  • 文敦复
    2023-07-05 来自四川
    请教下,文中提到“同步和异步更多是语言语法的实现,同步发送主要解决数据发送的即时性和顺序性,异步发送主要考虑性能。” 这里为什么会说“同步发送主要解决数据发送的即时性”,这个“即时性”如何理解?异步发送不具备吗?
    
    