标签:nqs

0

2951

NSQ的设计特点

nsq的设计特点

分布式的队列传输节点,能够避免传输节点的单点故障,确保消息一定会被传输一次, 但是这样可能引起消息被多次传输 bound the memory footprint of a single process (by persisting some messages to disk)简化消费者和生产者的配置, 提供了一个简单明确的升级路线,提升了效率。

nsqde的基本概念

  • nsqd, 转发消息的核心, 负责接受消息, 将消息排队, 发送给客户端, 不同的nsqd之间的消息不会共享
  • nsqlookupd ,只是提供client查询当前所有的nsqd的信息, 不会对实际的消息转发做任何的处理, nsqlookupd于nsqd之间在底层建立了tcp的长连接连接, 而默认监听的4160端口就是干这个用的,通过周期性的报告nsqd的状态,
  • client 消费者, 需要配置nsqlookupd的地址
  • nsqadmin 供管理员集中查看所有的集群,有一个webui
  • topic, 属于nsqd, 就是一个消息流,目测是对业务的标志, 或者是为了将同一个物理管道进行逻辑细分的方式, 算是为了提高效率和细分资源,topic并不需要进行实现的配置,一个nsqd可能拥有多个topic
  • channel, 属于nsqd,是发送给一个topic的逻辑组, 一个topic可能用拥有多个channel, 每个channel都能收到这个topic下面的所有的消息, 一般一个channel都会对应一个消费者, 而一个channel可以对应多个消费者,channale会将消息随机发送给下面的一个client,所以任意一个client收到的消息都不是完全的,
  • channel和topic都是单独缓存消息的

分布式方案

  • nsqd随意起, nsqlookup使用备份的方式
  • 一个client只会同时对一个nsqd建立连接, 所以一旦一个nsqd连接, 那么就不会对其他的topic建立连接
  • 只有再一个nsqd坏掉的时候,才会重新选择nsqd
  • 那么client选择nsqd的原则是什么?

nsq保证消息能够正常至少传输一次的方式是

  1. client表明已经可以接受消息。
  2. nsqd将消息发送出去, 同时将这个消息进行本地存储。
  3. client如果回复FIN 表示成功接受, 如果回复REQ, 表明需要重发, 如果没有回复, 则认为超时了, 进行重发。

所以, 当nsqd异常关闭的时候, 没有来得及保存到本地的消息可能会丢失, 解决办法是讲同样的消息发送到两个nsqd中。

这里如何保证消息不丢失的?

nsdlookup 如何路由请求

{
    "channels": [ "nsq_to_file", "c" ], 
    "producers": [ 
        { 
            "remote_address": "127.0.0.1:58148", 
            "hostname": "safedev01v.add.corp.qihoo.net", 
            "broadcast_address": "safedev01v.add.corp.qihoo.net", 
            "tcp_port": 4150, 
            "http_port": 4151, 
            "version": "0.3.6" 
        }, 
        { 
            "remote_address": "10.16.59.85:39652", 
            "hostname": "safedev02v.add.corp.qihoo.net", 
            "broadcast_address": "safedev02v.add.corp.qihoo.net", 
            "tcp_port": 4150, 
            "http_port": 4151, 
            "version": "0.3.7" 
         } 
     ] 
}

雪崩如何处理

……

乐果   发表于   2018 年 06 月 27 日 标签:nqs 继续阅读

热评文章