RabbitMQ消息队列

  !!!  注意,保证服务器的内存足够,磁盘足够,以及删除/etc/hosts中没有用的dns解析

# 优点,能够保证消息数据持久化,不丢失,支持高并发

安装学习rabbitmq消息队列,配置好阿里云的yum源

1.yum -y install erlang  rabbitmq-server

2.启动rabbitmq服务端
systemctl start rabbitmq-server 3.开启rabbitmq的web控制台
rabbitmq-plugins enable rabbitmq_management 4.重启后生效web界面
systemctl restart rabbitmq-server
# 查看是否生效,出现登录页面就成功了
http://192.168.81.130:15672/ # 端口必须是这个 5.创建rabbitmq用户
sudo rabbitmqctl add_user attila 666

6.设置用户的权限,为admin管理员权限
sudo rabbitmqctl set_user_tags attila administrator 7.允许attila这个用户对所有的队列进行读写
sudo rabbitmqctl set_permissions -p "/" attila ".*" ".*" ".*" 8.可以用attila登录 rabbitmq的后台界面管理了

  no-ack机制

    不确定机制,就是每次消费者接收完数据后,不管是否处理完毕,rabbitmq-server都会把这个消息标记完成,从队列中删除

# 建一个py文件,叫做生产者.py
#!/usr/bin/env python
import pika
# 创建凭证,使用rabbitmq用户密码登录
# 去邮局取邮件,必须得验证身份
credentials = pika.PlainCredentials("attila","")
# 新建连接,这里localhost可以更换为服务器ip
# 找到这个邮局,等于连接上服务器
connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.81.130',credentials=credentials))
# 创建频道
# 建造一个大邮箱,隶属于这家邮局的邮箱,就是个连接
channel = connection.channel()
# 声明一个队列,用于接收消息,队列名字叫“笑傲江湖”
channel.queue_declare(queue='笑傲江湖')
# 注意在rabbitmq中,消息想要发送给队列,必须经过交换(exchange),初学可以使用空字符串交换(exchange=''),
  它允许我们精确的指定发送给哪个队列(routing_key=''),参数body值发送的数据
channel.basic_publish(exchange='',
routing_key='笑傲江湖',
body='独孤九剑潇洒非凡')
print("已经发送了消息")
# 程序退出前,确保刷新网络缓冲以及消息发送给rabbitmq,需要关闭本次连接
connection.close()
# 启动py文件,查看浏览器上的RabbitMQ, http://192.168.81.130:15672/ 必须是这个端口 此时,浏览器上应该有一条数据了

  生产者已经有了,这时候准备一个消费者

import pika
# 建立与rabbitmq的连接
credentials = pika.PlainCredentials("attila","")
connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.81.130',credentials=credentials))
channel = connection.channel()
channel.queue_declare(queue="笑傲江湖") def callbak(ch,method,properties,body):
print("消费者接收到了任务:%r"%body.decode("utf8"))
# 有消息来临,立即执行callbak,没有消息则夯住,等待消息
# 老百姓开始去邮箱取邮件啦,队列名字是水许传
channel.basic_consume(callbak,queue="笑傲江湖",no_ack=True) # no_ack=True, 就是不需要回复,我只负责取走,不给你反馈
# 开始消费,接收消息
channel.start_consuming() # 在浏览器上查看rabbitmq,发现消息没有了 

  ACK机制(用于单发送多接收)

一个发送端,多个接收端,如分布式的任务派发。为了保证消息发送的可靠性,不丢失消息,使消息持久化了。
  同时为了防止接收端在处理消息时down掉,只有在消息处理完成后才发送ack消息。
# ACK机制用于保证消费者如果拿了队列的消息,客户端处理时出错了,那么队列中任然还存在这个消息,等待下一位消费者继续取.

  建一个 生产者.py文件

#!/usr/bin/env python
import pika
# 创建凭证,使用rabbitmq用户密码登录
# 比如去邮局取邮件,必须得验证身份
credentials = pika.PlainCredentials("attila","")
# 新建连接,这里localhost可以更换为服务器ip
# 找到这个邮局,等于连接上服务器
connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.81.130',credentials=credentials))
# 创建频道
# 建造一个大邮箱,隶属于这家邮局的邮箱,就是个连接
channel = connection.channel()
# 新建一个hello队列,用于接收消息
# 这个邮箱可以收发各个班级的邮件,通过
channel.queue_declare(queue='笑傲江湖')
# 注意在rabbitmq中,消息想要发送给队列,必须经过交换(exchange),初学可以使用空字符串交换(exchange=''),
  它允许我们精确的指定发送给哪个队列(routing_key=''),参数body值发送的数据
channel.basic_publish(exchange='',
routing_key='笑傲江湖',
body='令狐冲独孤九剑笑傲江湖')
print("已经发送了消息")
# 程序退出前,确保刷新网络缓冲以及消息发送给rabbitmq,需要关闭本次连接
connection.close()
# 启动py文件,查看浏览器上的RabbitMQ, http://192.168.81.130:15672/ 此时,浏览器上应该有一条数据了

  创建一个消费者

import pika

credentials = pika.PlainCredentials("s14","")
connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.119.10',credentials=credentials))
channel = connection.channel() # 声明一个队列(创建一个队列)
channel.queue_declare(queue='笑傲江湖') def callback(ch, method, properties, body):
print("消费者接受到了任务: %r" % body.decode("utf-8"))
# int('嘻嘻嘻') # 强转为了让他报错,但是消息取出来了,也就是没有消息了,那么这样会丢数据,所以需要把no-ack改为False
# 我告诉rabbitmq服务端,我已经取走了消息
# 回复方式在这
ch.basic_ack(delivery_tag=method.delivery_tag)
# 关闭no_ack,代表给与服务端ack回复,确认给与回复,这样如果取数据过程中出错,rabbitmq中消息不会被取走.
channel.basic_consume(callback,queue='笑傲江湖',no_ack=False) channel.start_consuming()

  消息持久化

# 演示
1.执行生产者,向队列写入数据,产生一个新队列queue
2.重启服务端,队列丢失 3.开启生产者数据持久化后,重启rabbitmq,队列不丢失
4.依旧可以读取数据

  创建可持久化的队列

    生产者.py

import pika
# 无密码
# connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.81.130'))
# 有密码
credentials = pika.PlainCredentials("attila","")
connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.81.130',credentials=credentials))
channel = connection.channel()
# 声明一个队列(创建一个队列)
# 默认此队列不支持持久化,如果服务挂掉,数据丢失
# durable=True 开启持久化,必须新开启一个队列,原本的队列已经不支持持久化了
'''
实现rabbitmq持久化条件
delivery_mode=2
使用durable=True声明queue是持久化 '''
channel.queue_declare(queue='天龙八部',durable=True)
channel.basic_publish(exchange='',
routing_key='天龙八部', # 消息队列名称
body='降龙十八掌天下第一',
# 支持数据持久化
properties=pika.BasicProperties(
delivery_mode=2,#代表消息是持久的 2
)
)
connection.close()

  消费者.py

import pika
credentials = pika.PlainCredentials("attila","")
connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.81.30',credentials=credentials))
channel = connection.channel()
# 确保队列持久化
channel.queue_declare(queue='天龙八部',durable=True) '''
必须确保给与服务端消息回复,代表我已经消费了数据,否则数据一直持久化,不会消失
'''
def callback(ch, method, properties, body):
print("消费者接受到了任务: %r" % body.decode("utf-8"))
# 模拟代码报错
# int('asdfasdf') # 此处报错,没有给予回复,保证客户端挂掉,数据不丢失 # 告诉服务端,我已经取走了数据,否则数据一直存在
ch.basic_ack(delivery_tag=method.delivery_tag)
# 关闭no_ack,代表给与回复确认
channel.basic_consume(callback,queue='天龙八部',no_ack=False)
channel.start_consuming()

RabbitMQ消息队列的更多相关文章

  1. RabbitMQ消息队列(一): Detailed Introduction 详细介绍

     http://blog.csdn.net/anzhsoft/article/details/19563091 RabbitMQ消息队列(一): Detailed Introduction 详细介绍 ...

  2. RabbitMQ消息队列1: Detailed Introduction 详细介绍

    1. 历史 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然在同步消息通讯的世界里有 ...

  3. (转)RabbitMQ消息队列(九):Publisher的消息确认机制

    在前面的文章中提到了queue和consumer之间的消息确认机制:通过设置ack.那么Publisher能不到知道他post的Message有没有到达queue,甚至更近一步,是否被某个Consum ...

  4. (转)RabbitMQ消息队列(七):适用于云计算集群的远程调用(RPC)

    在云计算环境中,很多时候需要用它其他机器的计算资源,我们有可能会在接收到Message进行处理时,会把一部分计算任务分配到其他节点来完成.那么,RabbitMQ如何使用RPC呢?在本篇文章中,我们将会 ...

  5. (转)RabbitMQ消息队列(六):使用主题进行消息分发

    在上篇文章RabbitMQ消息队列(五):Routing 消息路由 中,我们实现了一个简单的日志系统.Consumer可以监听不同severity的log.但是,这也是它之所以叫做简单日志系统的原因, ...

  6. (转)RabbitMQ消息队列(四):分发到多Consumer(Publish/Subscribe)

    上篇文章中,我们把每个Message都是deliver到某个Consumer.在这篇文章中,我们将会将同一个Message deliver到多个Consumer中.这个模式也被成为 "pub ...

  7. RabbitMQ消息队列应用

    RabbitMQ消息队列应用 消息通信组件Net分布式系统的核心中间件之一,应用与系统高并发,各个组件之间解耦的依赖的场景.本框架采用消息队列中间件主要应用于两方面:一是解决部分高并发的业务处理:二是 ...

  8. RabbitMQ消息队列(四):分发到多Consumer(Publish/Subscribe)

    上篇文章中,我们把每个Message都是deliver到某个Consumer.在这篇文章中,我们将会将同一个Message deliver到多个Consumer中.这个模式也被成为 "pub ...

  9. RabbitMQ消息队列(九):Publisher的消息确认机制

    在前面的文章中提到了queue和consumer之间的消息确认机制:通过设置ack.那么Publisher能不到知道他post的Message有没有到达queue,甚至更近一步,是否被某个Consum ...

  10. 使用EasyNetQ组件操作RabbitMQ消息队列服务

    RabbitMQ是一个由erlang开发的AMQP(Advanved Message Queue)的开源实现,是实现消息队列应用的一个中间件,消息队列中间件是分布式系统中重要的组件,主要解决应用耦合, ...

随机推荐

  1. TabTopAutoTextSizeLayout【自定义文字字号区域(动态选项卡数据且可滑动)】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 自定义顶部选项卡布局LinearLayout类,实现可滑动效果.[实际情况中建议使用RecyclerView] 对<TabTo ...

  2. Vue2.0源码阅读笔记(一):选项合并

      Vue本质是上来说是一个函数,在其通过new关键字构造调用时,会完成一系列初始化过程.通过Vue框架进行开发,基本上是通过向Vue函数中传入不同的参数选项来完成的.参数选项往往需要加以合并,主要有 ...

  3. 详解TypScript数据类型转换

    最近在用TypeScript(后面简称TS),发现TS虽然语法和C#差不多但是在很多地方还是不够高级(和C#相比),这里主要聚焦在数据类型强转上面,直接看下面案例吧 string转number 案例如 ...

  4. 2016年第七届蓝桥杯javaB组 试题 答案 解析

    1.煤球数目 有一堆煤球,堆成三角棱锥形.具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形), .... 如果一共有100层,共有多少个煤 ...

  5. SAP MM A工厂下的PR可以转成B工厂下的PO?

    SAP MM A工厂下的PR可以转成B工厂下的PO? 答案是可能的,这也是SAP标准行为之一. 如下图采购申请单据, PR中的Plant是GENL.该PR 已经转成了PO,如上图. 看这个PO,工厂代 ...

  6. @Resource 与 @Service注解的区别

    pring中什么时候用@Resource,什么时候用@service当你需要定义某个类为一个bean,则在这个类的类名前一行使用@Service("XXX"),就相当于讲这个类定义 ...

  7. Java关于日期的计算持续汇总~

    /** * 00 * 描述:传入Date date.转为 String yyyyMMdd. * [时间 2019-04-18 15:41:12 作者 陶攀峰] */ public static Str ...

  8. Python编写的Linux邮件发送工具

    之前有用过Linux自带的mail工具来定时发送邮件,但是要装mailx还有配mail.rc,这还比较正常,关键是到了ubantu下这工具用起来真是操蛋,如果哪天其他的unix like操作系统也有需 ...

  9. oracle异地备份

    一.安装oracle客户端 右键以管理员身份运行 选择管理员 跳过软件更新 选择语言,默认中文 指定安装位置 检查当前环境 安装 二.使用exp命令备份 exp 用户名/密码@IP地址/数据库 own ...

  10. Runnable和Callable之间的区别

    Runnable和Callable之间的区别 1.Runnable任务执行后没有返回值:Callable任务执行后可以获得返回值 2.Runnable的方法是run(),没有返回值:Callable的 ...