一、关于AMQP:

AMQP,即Advanced Message Queuing Protocol,高级消息队列协议。

AMQP使符合要求的客户端应用程序能够与符合要求的消息传递中间件代理进行通信。

AMQP是一种新的消息传递中间件开放标准。它解决了如何跨LANS和WANS连接应用程序的问题。在AMQP之前,没有相互连接应用程序的标准,这是大型软件体系结构中比较昂贵的部分之一。AMQP是一个线级协议,外加一个用于路由和消息排队的模型。它包括非常高性能的发布-订阅(通过单个代理的速度可达每秒150k条消息)和高可靠性的消息传递(无论如何都保证交付)。

AMQP是一种可编程的协议:

定义了三种实体(对象)
  queues, exchanges, bindings
  queues :队列,存储信息,用于消费
  exchanges : 消息中转站,包含多种类型
  bindings :消息转发规则,定义了route,规定怎么把消息发送到队列

二、关于RabbitMQ:

RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而群集和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。

消息代理的应用:

  (1)将消息路由到一个或多个目的地
  (2)将消息转换为替代表示
  (3)执行消息聚合,将消息分解为多个消息并将其发送到目的地,然后将响应重新组合成一条消息以返回给用户
  (4)与外部的存储库交互以扩充消息或存储消息
  (5)调用web服务以检索数据
  (6)回应事件或错误
  (7)使用发布订阅模式提供内容和基于主题的消息路由

三、RabbitMQ交换机exchanges的四种类型:

exchanges 的属性:
  name 名字
  durability 持久化
  auto-delete 自动删除(所有队列都解除绑定的时候)

exchanges 类型: direct exchange,fanout exchange,topic exchange,headers exchange

1、direct exchange:
  queue创建时,绑定一个同名的routing key
  用途:把任务分配给多个workers, 每个work做特定工作,比如写日志

 2、fanout exchange:
  传递消息到每一个queue,忽略routeing key
  用途:多处记录日志,统一发布通知,球赛更新比分, 分布式系统更新配置信息

3、topic exchange:
  根据规则匹配相应的queue, 实现订阅发布
  用途:根据不同标签更新新闻,根据位置信息提供商品

4、Headers Exchange
  根据多个属性当做消息头,忽略routing key, 需要开发者定义更多内容
  用途:当direct 和routeing key 不是字符串时,可使用这个自定义属性匹配

四、python简单操作RabbitMQ:

client端:消费信息

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# msg_worker.py
# Author:Riy import time
import pika # 连接服务
config = {
"username": "root",
"password": "root",
"host": "127.0.0.1",
"port": ""
}
creds = pika.PlainCredentials(config["username"], config["password"])
params = pika.ConnectionParameters(config["host"], credentials=creds)
connection = pika.BlockingConnection(params) # 创建队列
channel = connection.channel()
channel.queue_declare(queue="msg_queue", durable=True) # 接收,消费消息
def callback(ch, method, properties, body):
print(f"收到消息:{body}")
time.sleep(body.count(b"-"))
print('ok')
ch.basic_ack(delivery_tag=method.delivery_tag) # 均衡任务
channel.basic_qos(prefetch_count=1)
channel.basic_consume("msg_queue", callback) channel.start_consuming()

server端:发送信息

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# msg_pub.py
# Author:Riy import sys
import pika # 连接服务
config = {
"username": "root",
"password": "root",
"host": "127.0.0.1",
"port": ""
}
creds = pika.PlainCredentials(config["username"], config["password"])
params = pika.ConnectionParameters(config["host"], credentials=creds)
connection = pika.BlockingConnection(params) # 创建队列
channel = connection.channel()
channel.queue_declare(queue="msg_queue", durable=True) # 发送消息
msg = " ".join(sys.argv[1:]) or "new msg from Riy"
channel.basic_publish(exchange="",
routing_key="msg_queue",
body=msg,
properties=pika.BasicProperties(
delivery_mode=2 # TODO
)) print(f"发送消息:{msg}")
connection.close()

python浅学【网络服务中间件】之RabbitMQ的更多相关文章

  1. python浅学【网络服务中间件】之Redis

    一.关于NoSQL: NoSQL(NoSQL = Not Only SQL ),"不仅仅是SQL". 相比MySQL等关系型数据库,NoSQL为非关系型的数据存储 Nosql中比较 ...

  2. python浅学【网络服务中间件】之Memcached

    一.缓存的由来: 提升性能 绝大多数情况下,select 是出现性能问题最大的地方.一方面,select 会有很多像 join.group.order.like 等这样丰富的语义,而这些语义是非常耗性 ...

  3. python浅学【网络服务中间件】之Celery

    一.关于Celery: 什么是任务队列: 任务队列一般用于线程或计算机之间分配工作的一种机制. 任务队列的输入是一个称为任务的工作单元,有专门的工作进行不断的监视任务队列,进行执行新的任务工作. 什么 ...

  4. python浅学【网络服务中间件】之MongoDB

    一.关于MongoDB: MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统. 在高负载的情况下,添加更多的节点,可以保证服务器性能. MongoDB 旨在为WEB应用提供 ...

  5. 浅谈surging服务引擎中的rabbitmq组件和容器化部署

    1.前言 上个星期完成了surging 的0.9.0.1 更新工作,此版本通过nuget下载引擎组件,下载后,无需通过代码build集成,引擎会通过Sidecar模式自动扫描装配异构组件来构建服务引擎 ...

  6. greenev —— Python 异步网络服务框架

    greenev是一个基于greenlet协程,事件驱动,非阻塞socket模型的Python网络服务框架,它使得可以编写同步的代码,却得到异步执行的优点. 本项目受到gevent, openresty ...

  7. 浅谈Django的中间件与Python的装饰器

    浅谈Django的中间件 与Python的装饰器 一.原理 1.装饰器是Python的一种语法应用,利用闭包的原理去更改一个函数的功能,即让一个函数执行之前先到另外一个函数中执行其他需求语句,在执行该 ...

  8. iOS WebServiceFramework网络服务框架浅解

    网络服务几乎是每一款成功APP的必备条件,打开你手机你会发现里面不用联网的应用数量十只手指可以数出来,就算是一些以独特技术切入市场的APP如美颜相机,都至少加入了分享功能.下面我先做下简单的回顾兼扫盲 ...

  9. python高级之网络编程

    python高级之网络编程 本节内容 网络通信概念 socket编程 socket模块一些方法 聊天socket实现 远程执行命令及上传文件 socketserver及其源码分析 1.网络通信概念 说 ...

随机推荐

  1. Y事业部打造一体化质量管理平台

    互联网企业质量管理的困惑 作为互联网时代的互联网企业,我们的研发模式和传统模式相比,最显著的不同在于发布节奏加快了,这个加快不是快了10%,20%,50%,而是加快了几倍,甚至几十倍,上百倍.面对加快 ...

  2. sql -- 获取连续签到的用户列表

    签到表: 需求:统计连续签到的 用户 1.根据用户和日期分组 select user_name, sign_date from user_sign group by user_name, sign_d ...

  3. Metaploit-永恒之蓝漏洞利用

    目录 Metaploit介绍 实验环境 漏洞利用过程 Metaploit介绍 本次测试主要是利用永恒之蓝漏洞对windows7进行控制利用,掌握Metaploit工具的使用,知道永恒之蓝的漏洞利用原理 ...

  4. Django报Warning错误 RuntimeWarning: DateTimeField Goods.create_at received a naive datetime (2019-07-31 23:05:58) while time zone support is active

    报错和UTC(世界标准时间)有关,在settings.py 文件中设置 USE_TZ = False 警告错误不再报

  5. 高性能内存队列Disruptor--原理分析

    1.起源     Disruptor最初由lmax.com开发,2010年在Qcon公开发表,并于2011年开源,其官网定义为:"High Performance Inter-Thread ...

  6. 【面试必备】硬核!30 张图解 HTTP 常见的面试题

    每日一句英语学习,每天进步一点点: 前言 在面试过程中,HTTP 被提问的概率还是比较高的.小林我搜集了 5 大类 HTTP 面试常问的题目,同时这 5 大类题跟 HTTP 的发展和演变关联性是比较大 ...

  7. 迄今为止最硬核的「Java8时间系统」设计原理与使用方法

    为了使本篇文章更容易让读者读懂,我特意写了上一篇<任何人都需要知道的「世界时间系统」构成原理,尤其开发人员>的科普文章.本文才是重点,绝对要读,走起! Java平台时间系统的设计方案 几乎 ...

  8. guava限流器RateLimiter原理及源码分析

    前言 RateLimiter是基于令牌桶算法实现的一个多线程限流器,它可以将请求均匀的进行处理,当然他并不是一个分布式限流器,只是对单机进行限流.它可以应用在定时拉取接口数据, 预防单机过大流量使用. ...

  9. Head First设计模式——中介者模式和备忘录模式

    中介者 中介者模式:使用中介者来集中相关对象之间复杂的沟通方式和控制方式. Bob有一个自动屋,当他的闹钟响了只有,闹钟会告诉咖啡壶开始煮咖啡.后来客户不断的提出许多新需求:周末不要提供咖啡.下班后需 ...

  10. JS的3种核心设计模式

    一.单例模式 1.保证一个类仅有一个实例,并提供一个访问它的全局访问点 2.设计思路:如果存在,不创建,直接返回,不存在才创建. 在类的constructor方法里添加一个判断条件属性,并且让创建的实 ...