NSQ
首先,一个发布者向它的本地nsqd发送消息,要做到这点,首先要先打开一个连接 , 然后发送一个包含topic和消息主体的发布命令,在这种情况下 , 我们将消息发布到事件topic上以分散到我们不同的worker中 。
事件topic会复制这些消息并且在每一个连接topic的channel上进行排队,在我们的案例中,有三个channel,它们其中之一作为档案channel 。消费者会获取这些消息并且上传到S3 。
nsqd
每个channel的消息都会进行排队,直到一个worker把他们消费,如果此队列超出了内存限制,消息将会被写入到磁盘中 。Nsqd节点首先会向nsqlookup广播他们的位置信息,一旦它们注册成功 , worker将会从nsqlookup服务器节点上发现所有包含事件topic的nsqd节点 。
nsqlookupd
2. Internals
2.1 消息传递担保
1)客户表示已经准备好接收消息
2)NSQ 发送一条消息 , 并暂时将数据存储在本地(在 re-queue 或 timeout)
3)客户端回复 FIN(结束)或 REQ(重新排队)分别指示成功或失败 。如果客户端没有回复, NSQ 会在设定的时间超时,自动重新排队消息
这确保了消息丢失唯一可能的情况是不正常结束 nsqd 进程 。在这种情况下,这是在内存中的任何信息(或任何缓冲未刷新到磁盘)都将丢失 。
如何防止消息丢失是最重要的,即使是这个意外情况可以得到缓解 。一种解决方案是构成冗余 nsqd对(在不同的主机上)接收消息的相同部分的副本 。因为你实现的消费者是幂等的,以两倍时间处理这些消息不会对下游造成影响,并使得系统能够承受任何单一节点故障而不会丢失信息 。
2.2 简化配置和管理
单个 nsqd 实例被设计成可以同时处理多个数据流 。流被称为“话题”和话题有 1 个或多个“通道” 。每个通道都接收到一个话题中所有消息的拷贝 。在实践中,一个通道映射到下行服务消费一个话题 。
在更底的层面,每个 nsqd 有一个与 nsqlookupd 的长期 TCP 连接,定期推动其状态 。这个数据被 nsqlookupd 用于给消费者通知 nsqd 地址 。对于消费者来说,一个暴露的 HTTP /lookup 接口用于轮询 。为话题引入一个新的消费者,只需启动一个配置了 nsqlookup 实例地址的 NSQ 客户端 。无需为添加任何新的消费者或生产者更改配置,大大降低了开销和复杂性 。
2.3 消除单点故障
NSQ被设计以分布的方式被使用 。nsqd 客户端(通过 TCP )连接到指定话题的所有生产者实例 。没有中间人 , 没有消息代理,也没有单点故障 。
这种拓扑结构消除单链 , 聚合 , 反馈 。相反,你的消费者直接访问所有生产者 。从技术上讲,哪个客户端连接到哪个 NSQ 不重要,只要有足够的消费者连接到所有生产者,以满足大量的消息,保证所有东西最终将被处理 。对于 nsqlookupd,高可用性是通过运行多个实例来实现 。他们不直接相互通信和数据被认为是最终一致 。消费者轮询所有的配置的 nsqlookupd 实例和合并 response 。失败的 , 无法访问的,或以其他方式故障的节点不会让系统陷于停顿 。
2.4 效率
对于数据的协议,通过推送数据到客户端最大限度地提高性能和吞吐量的,而不是等待客户端拉数据 。这个概念,称之为 RDY 状态,基本上是客户端流量控制的一种形式 。
efficiency
2.5 心跳和超时
组合应用级别的心跳和 RDY 状态 , 避免头阻塞现象 , 也可能使心跳无用(即,如果消费者是在后面的处理消息流的接收缓冲区中,操作系统将被填满,堵心跳)为了保证进度,所有的网络 IO 时间上限势必与配置的心跳间隔相关联 。这意味着,你可以从字面上拔掉之间的网络连接 nsqd 和消费者 , 它会检测并正确处理错误 。当检测到一个致命错误,客户端连接被强制关闭 。在传输中的消息会超时而重新排队等待传递到另一个消费者 。最后 , 错误会被记录并累计到各种内部指标 。
推荐阅读
- mac移动硬盘怎么加密,mac给移动硬盘加密
- 家用三千能配什么电脑显卡,3000能配置什么样的家用电脑
- html5扫二维码识别功能,html 二维码
- mysql数据连接url,MySQL数据连接分几步
- 用mysql语句怎么写 mysql怎样用
- 新媒体运营数据如何统计,新媒体运营怎么看数据
- 包含word怎么插入cad的词条
- 法拉利竞速游戏威锋,法拉利 游戏
- 导入函数c语言是什么作用 c++导入函数