假如我在家里,且没有申请公网 IP ,那么在家里的电脑上写得代码,都是处理一个 NAT 的网络环境
以下操作,默认,在家里的,NAT 的网络下,进行
假如我在电脑上写了一个服务,有两个方法,一个是生产者( sendMqMsg ,topic 是 test-mq ),一个消费者( consumerMqMsg ,topic 和上面的对应)
这个服务上面,链接的是云厂商的 mq ,这个 mq 是肯定有公网 ip 的。( mq 可以是 mqtt ,rabbitmq ,kafka ,rocketmq 等)
(之前看 rocketmq 的代码,好像有推模型和拉模型,但是我不理解)
总结以上描述的重点:mq 的 broker 是怎么精准的把消息发到我的服务里面的呢,,我的服务明明是一个 NAT 的网络环境。外部应该不能够直接调用来咋。。
1
vitoliu 2022-12-06 14:56:54 +08:00 via iPhone 1
别想那么多复杂的问题,只要你能连 broker 的网,建立长连接后直接就能推送接收
|
2
Chad0000 2022-12-06 14:58:09 +08:00 via iPhone 1
你手机在 nat 里微信还不是实时推送消息给你了。
长链接。 |
3
lazyfighter 2022-12-06 14:59:24 +08:00 1
broker 是存储消息的,一般还有一方负责协调各个 broker , 无论你作为生产者还是消费者都是跟《协调者》进行交互,协调者会告诉你 broker 的地址,然后客户端直接跟 broker 进行交互,也就是 broker 跟你的客户端也需要网络通才行,推拉很简单,broker push 消息到你的消费者就是推模式,client 定时拉去消息到客户端这就是拉模式
|
4
RedBeanIce OP @vitoliu
@Chad0000 @lazyfighter 得到一个这样的答案 白烟染黑墨 2022/12/6 14:55:38 你客户端不是要主动连接服务端吗? 想写 im 的 雪糕 2022/12/6 14:56:25 你的意思是 http 通过长链接或者心跳,等 http 手段处理的么? 白烟染黑墨 2022/12/6 14:57:01 只要是 TCP 就可以 白烟染黑墨 2022/12/6 14:57:10 udp 不保证 想写 im 的 雪糕 2022/12/6 14:58:18 大佬有个问题,你的家庭是 nat 网络,,,,,,,,远在云服务商服务器,是如何调用处于 nat 网络的你的呢 白烟染黑墨 2022/12/6 14:59:51 你需要去看 TCP/IP 网络相关的书籍,有个 NAT 映射表的,出去的时候会建立,回来的时候只要这个表还在就可以通讯。 白烟染黑墨 2022/12/6 15:00:18 你是计算机专业的吗 想写 im 的 雪糕 2022/12/6 15:00:39 计网知识缺乏 Touch Sky 2022/12/6 15:00:54 可以了解一下 iptables 想写 im 的 雪糕 2022/12/6 15:01:03 收到 想写 im 的 雪糕 2022/12/6 15:01:05 我去了解下 Touch Sky 2022/12/6 15:01:11 三层网络转发 想写 im 的 雪糕 2022/12/6 15:02:29 我去详细找找 nat 的知识。。感谢。 |
5
dextercai 2022-12-08 15:37:42 +08:00
理解有一点偏误。不管是推模型还是拉模型,前提都是 Client 连到 Broker 建立长连接。
简单点来说:推模型是订阅 topic 之后,服务器主动在这个长连接里面给你推数据;而拉模型是相当于请求对应的 topic ,服务器再给你传过来。 换句话来说,对线上的 Broker ,不需要处理“怎么找到你的服务”或者“怎么连接到你的服务”这个问题,因为所有的操作都是建立在你和 Broker 的长连接的前提下。 你贴的这个聊天记录,讲的是在 NAT ( IP Masquerade )网络环境下,怎么去保持这样的一个 TCP 连接的,对应的网络设备上会维护一个 NAT 表项,对于 UDP 和 TCP 会有不同的保活机制、超时时长。和应用层上的消息队列没啥太大关系。 |
6
RedBeanIce OP |