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. PyCharm:选择性忽略 PEP8 警告

    PyCharm 是个很强大的 python IDE,PEP 8 的告警提示也很好用,但是函数名不能包含大写字母等少数几个规范真心觉得不好,作为一名处女座强迫症患者,代码下面的波浪线这种东西是绝对不允许 ...

  2. Data Lake Analytics + OSS数据文件格式处理大全

    0. 前言 Data Lake Analytics是Serverless化的云上交互式查询分析服务.用户可以使用标准的SQL语句,对存储在OSS.TableStore上的数据无需移动,直接进行查询分析 ...

  3. (二)surging 微服务框架使用系列之surging 的准备工作consul安装

    suging 的注册中心支持consul跟zookeeper.因为consul跟zookeeper的配置都差不多,所以只是consul的配置 consul下载地址:https://www.consul ...

  4. c++性能测试工具:google benchmark入门(一)

    如果你正在寻找一款c++性能测试工具,那么这篇文章是不容错过的. 市面上的benchmark工具或多或少存在一些使用上的不便,那么是否存在一个使用简便又功能强大的性能测试工具呢?答案是google/b ...

  5. Java 数组及数组常用算法

    1 数组也是一种类型 Java中要求所有的数组元素具有相同的数据类型.因此在一个数组中,数组元素的类型是唯一的,不能存储多种类型的数据. 一旦数组的初始化完成,数组在内存中所占的空间将被固定下来,因此 ...

  6. Java初学习-常见单词

    implements    实行/实现      用于实现接口(interface) extends           延伸/扩展         用于类的继承 container        容 ...

  7. 小米5.0以上系统如何没ROOT激活xposed框架的经验

    在较多企业的引流或者业务操作中,大多数需要使用安卓的黑高科技术xposed框架,这段时间,我们企业购买了一批新的小米5.0以上系统,大多数都是基于7.0以上版本,大多数不能够获取Root的su超级权限 ...

  8. Kali Linux入坑之基本配置(2018.1)

    我在?天前就决心如Kali的坑,然而安装kali呀vm tools呀更新呀弄了好几天.期间出现的各种问题在此汇总一下. 1.Kali的安装版本选择 在官网上看到的这么多Kali版本应该怎么选呢,在网上 ...

  9. 开启远程桌面连接windows的方法以及遇到的问题

    确认电脑的远程服务是否已经开启 开始--运行--输入“services.msc ”,打开服务,找到三个remote desktop开头的服务 Remote Desktop Configuration. ...

  10. Storm入门(四)WordCount示例

    一.关联代码 使用maven,代码如下. pom.xml  和Storm入门(三)HelloWorld示例相同 RandomSentenceSpout.java /** * Licensed to t ...