RabbitMQ原理,使用场景,消息分发轮询 与 持久化,如何保证可靠消费

目录:

一. RabbitMq与Redis队列对比

1、RabbitMQ与Redis作用

  • RabbitMQ: RabbitMQ是一个可以在不同程序间共享数据的代理,是实现AMQP(高级消息队列协议)的消息中间件的一种
  • Redis: 是一个Key-Value的NoSQL数据库

2. 线程Queue,进程Queue和RabbitMQ区别

  • 进程Queue用于父进程与子进程(或同一父进程中多个子进程)间数据传递
  • python自己的多个进程间交换数据或者与其他语言(如Java)进程queue就无能为力
  • RabbitMQ就是这样一个可以在不同程序间共享数据的代理

3、具体对比

1. 可靠消费

  • Redis: 没有相应的机制保证消息的消费,当消费者消费失败的时候,消息体丢失,需要手动处理
  • RabbitMQ: 具有消息消费确认,即使消费者消费失败,也会自动使消息体返回原队列,同时可全程持久化,保证消息体被正确消费

2. 可靠发布

  • Reids: 不提供,需自行实现
  • RabbitMQ: 具有发布确认功能,保证消息被发布到服务器

3. 高可用

  • Redis: 采用主从模式,读写分离,但是故障转移还没有非常完善的官方解决方案
  • RabbitMQ: 集群采用磁盘、内存节点,任意单点故障都不会影响整个队列的操作

4. 持久化

  • Redis: 将整个Redis实例持久化到磁盘
  • RabbitMQ: 队列,消息,都可以选择是否持久化

5. 应用场景分析

  • Redis: 轻量级,高并发,延迟敏感即时数据分析、秒杀计数器、缓存等
  • RabbitMQ: 重量级,高并发,异步批量数据异步处理、并行任务串行化,高负载任务的负载均衡等

二. 在win7 64位机上安装RabbitMQ

1.安装RabbitMQ需要先安装Erlang语言开发包

  • 下载地址 http://www.erlang.org/download.html 在win7下安装Erlang最好默认安装。
  • C:\Program Files\erl8.3\bin 将Erlang的bin目录路径添加到环境变量

2.安装RabbitMQ 下载地址 http://www.rabbitmq.com/download.html

  • 1) 按照默认安装,安装RabbitMQ
  • 2) C:\Program Files\RabbitMQ Server\rabbitmq_server-3.6.8\sbin
    将sbin目录添加到path环境变量中
  • 3)安装完成后后就可以在windows的services.msc中看到RabbitMQ处于启动状态
  • 4)切换到执行命令目录: cd C:\Program Files\RabbitMQ
    Server\rabbitmq_server-3.6.8\sbin
a)       首先关闭rabbitmq:    rabbitmqctl stop_app

b)       还原:                       rabbitmqctl reset

c)        启动:                       rabbitmqctl start_app

d)       添加用户:                rabbitmqctl add_user root root

e)       设置权限:                rabbitmqctl set_permissions -p / root ".*" ".*" ".*"

f)      查看用户:                rabbitmqctl list_users 

g) 查看队列及未处理个数:  rabbitmqctl.bat list_queues

3.安装pike

注:为了支持RabbitMQ,每种语言都有自己专有的模块去与RabbitMQ通信,在python中最常用的是pika

  • 安装pika的方法: pip install pika

三. RabbitMQ消息分发轮询 与 持久化

1、RabbitMQ消息分发轮询:重启RabbitMq会丢失所有的queue中的数据

  • RabbitMQ默认采取轮询方法,将第一个消息发给a第二个发送给b以此类推
  • 默认生产者会将消息发送消费者后会等待确认,如果加上no_ack=True就不会等确认,如果消费者还未执行完就突然断了,那么这条数据不会被其他消费者接收到

生产者:不断向队列中放任务:

import pika

#1 建立一个最基本的socket
#2 ConnectionParameters指定连接的地址,可以加上端口号,用户名,密码等,本机不需要密码
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值