美文网首页
rabbitMQ基础知识点

rabbitMQ基础知识点

作者: 只有香如故 | 来源:发表于2017-12-04 08:28 被阅读169次
    基本过程

    reference

    RabbitMQ实现了AMQP(advanced message queue protocol)定义的消息队列:从Producer接收数据然后传递到Consumer。它能保证多并发,数据安全传递,可扩展.

    • 建立连接,
    • 创建channel
    • Producer和Consumer都应该去创建队列
    • Producer只能发送到exchange,它是不能直接发送到queue的。

    provider过程

    • 建立连接,
    • 创建channel
    • 创建交换机
    • 创建队列
    • 发布消息到交换机
    • 关闭信道
    • 关闭连接
      subscriber过程
    • 建立连接,
    • 创建channel
    • 创建交换机
    • 创建队列与provider同名
    • binding
    • 订阅消息
    • 关闭信道
    • 关闭连接

    !/usr/bin/env python

    import pika

    connection = pika.BlockingConnection(pika.ConnectionParameters(
    host='localhost'))
    channel = connection.channel()

    channel.queue_declare(queue='hello')

    channel.basic_publish(exchange='',
    routing_key='hello',
    body='Hello World!')
    print " [x] Sent 'Hello World!'"
    connection.close()


    import pika

    connection = pika.BlockingConnection(pika.ConnectionParameters(
    host='localhost'))
    channel = connection.channel()

    channel.queue_declare(queue='hello')

    print ' [*] Waiting for messages. To exit press CTRL+C'

    def callback(ch, method, properties, body):
    print " [x] Received %r" % (body,)

    channel.basic_consume(callback,
    queue='hello',
    no_ack=True)

    channel.start_consuming()

    多个订阅者分发
    • ack 消息确认
      如果采用no-ack的方式进行确认,每次Consumer接到数据后,而不管是否处理完成,RabbitMQ Server会立即把这个Message标记为完成,然后从queue中删除了。这样如果consumer出现异常,消息就会丢失。
    • Fair dispatch 公平分发
      通过 basic.qos 方法设置prefetch_count=1 。这样RabbitMQ就会使得每个Consumer在同一个时间点最多处理一个Message。换句话说,在接收到该Consumer的ack前,他它不会将新的Message分发给它。

    为了保证数据不被丢失,RabbitMQ支持消息确认机制,即acknowledgments。即consumer处理数据后发送的ack,就是告诉RabbitMQ数据已经被接收,处理完成,RabbitMQ可以去安全的删除它了。

    如果Consumer退出了但是没有发送ack,那么RabbitMQ就会把这个Message发送到下一个Consumer。这样就保证了在Consumer异常退出的情况下数据也不会丢失。如果RabbitMQ没有收到回执并检测到消费者的RabbitMQ连接断开,则RabbitMQ会将该消息发送给其他消费者(如果存在多个消费者)进行处理。这里不存在timeout概念,一个消费者处理消息时间再长也不会导致该消息被发送给其他消费者,除非它的RabbitMQ连接断开

    • 消息持久化
      ack是为了防止consumer无故退出,导致消息丢失的保护。
      如果rabbitMQ代理服务器崩溃了,如何处理呢 ,持久化queue和消息,把消息保存到磁盘上

    #######发送

    • Round Robin(轮询调度)
      如果有两个订阅者,RabbitMQ 会顺序的分发每个Message到两个订阅者(订阅1 得到1,3,5 ;订阅2 得到2,4)。当每个消息收到ack后,会将该Message删除,然后将下一个Message分发到下一个Consumer。这种分发方式叫做round-robin。

    --fanout--广播,不需要routing key
    如果希望同一条消息,每一个consumer都可以订阅,选择exchange为fanout

    --direct
    绑定时希望不同的队列分别订阅指定的消息,根据binding key与routing key相匹配的Queue。

    使用有名字的queue,使得在Producer和Consumer之前共享queue成为可能。此时交换机可以使用默认的‘’的交换机,主要使用routing_key实现队列的匹配。

    --topic 模糊匹配的用法
    将消息路由到binding key与routing key相匹配的Queue中,但这里的匹配规则有些不同,它约定:
    routing key为一个句点号“. ”分隔的字符串(我们将被句点号“. ”分隔开的每一段独立的字符串称为一个单词),如“stock.usd.nyse”、“nyse.vmw”、“quick.orange.rabbit”
    binding key与routing key一样也是句点号“. ”分隔的字符串
    binding key中可以存在两种特殊字符“”与“#”,用于做模糊匹配,其中“”用于匹配一个单词,“#”用于匹配多个单词(可以是零个)

    AMQP 预定义了14个属性。它们中的绝大多很少会用到。以下几个是平时用的比较多的:
    delivery_mode: 持久化一个Message(通过设定值为2)。其他任意值都是非持久化。请移步RabbitMQ消息队列(三):任务分发机制
    content_type: 描述mime-type 的encoding。比如设置为JSON编码:设置该property为application/json。
    reply_to: 一般用来指明用于回调的queue(Commonly used to name a callback queue)。
    correlation_id: 在请求中关联处理RPC响应(correlate RPC responses with requests)。

    比较关注的比较, RabbitMQ 和 Kafka
    RabbitMq 比Kafka 成熟,在可用性上,稳定性上,可靠性上, RabbitMq 胜于 Kafka (理论上)。
    另外,Kafka 的定位主要在日志等方面, 因为Kafka 设计的初衷就是处理日志的,可以看做是一个日志(消息)系统一个重要组件,针对性很强,所以 如果业务方面还是建议选择 RabbitMq 。
    还有就是,Kafka 的性能(吞吐量、TPS )比RabbitMq 要高出来很多。


    elk
    ELK由Elasticsearch、Logstash和Kibana三部分组件组成;
    Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。
    Logstash是一个完全开源的工具,它可以对你的日志进行收集、分析,并将其存储供以后使用
    kibana 是一个开源和免费的工具,它可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助您汇总、分析和搜索重要数据日志。
    2、四大组件
    Logstash: logstash server端用来搜集日志;
    Elasticsearch: 存储各类日志;
    Kibana: web化接口用作查寻和可视化日志;
    Logstash Forwarder: logstash client端用来通过lumberjack 网络协议发送日志到logstash server;
    3、ELK工作流程
    在需要收集日志的所有服务上部署logstash,作为logstash agent(logstash shipper)用于监控并过滤收集日志,将过滤后的内容发送到Redis,然后logstash indexer将日志收集在一起交给全文搜索服务ElasticSearch,可以用ElasticSearch进行自定义搜索通过Kibana 来结合自定义搜索进行页面展示。

    相关文章

      网友评论

          本文标题:rabbitMQ基础知识点

          本文链接:https://www.haomeiwen.com/subject/eejtixtx.html