Python网络编程 8 缓存与消息队列
前面已经介绍了套接字API以及在Python中使用的基础IP网络操作来构建通信信道的方式。本章研究服务负载较重时常用的两项基本技术:缓存与消息队列。这两项技术有如下一些共同特点:
- 都是非常强大的工具,因而广为流行。使用Memcached或一个消息队列,不是为了实现一个有趣的协议来与其他工具进行交互,二是为了编写优雅的服务来解决特定的问题。
- 这两项技术解决的问题通常是机构内部特有的问题。我们通常无法仅从外界就得知一个特定的网站或网络服务使用了哪种缓存、哪种消息队列以及哪种负载分配工具。
- 尽管HTTP和SMTP这样的工具都是针对一个特定的负载设计的(HTTP针对超文本文档,SMTP针对电子邮件消息),但是缓存和消息队列是无需了解它们所要传输的数据的。
- 我们可以将缓存和消息队列视为提供了两个已经造好的轮子,以避免重复的劳动。
- 在每台拥有空闲内存的服务器上都运行一个Memcached守护进程。
- 将所有Memcached守护进程的IP地址与端口号列出,并将该列表发送给所有将要使用Memcached的客户端。
- 客户端程序现在可以访问一个组织级的速度极快的键值缓存,它就像是所有服务器之间共享的一个巨大的Python字典。该缓存是基于LRU的。如果有些项长时间没有被访问的话,就会将这些项丢弃,为新访问的项挪出空间,并记录被频繁访问的项。
- Memcached的接口和Python的字典极其类似。将一个字符串作为值传入set()时,该字符串会以utf-8编码直接被写入Memcached,稍后在通过get()获取该字符串时会进行解码。除了简单字符串之外,写入任何其他Python对象都会自动触发memcache模块的pickle操作,然后将二进制的pickle存储在Memcached中。要牢记这一不同点,因为有时我们编写的Python应用程序会与用其他语言写的客户端共享Memcached缓存,此时,只有一字符串形式存储的值才可以被使用其他语言编写的客户端直接使用。
- 服务器是可以丢弃存储在Memcached中的数据的。Memcached的目的是将重复计算花销较高的结果记录下来,以此来加速操作。它不是用来作为数据的唯一存储区的!
- 当Memcached客户端得到了包含多个Memcached实例的列表时,会根据每个键的字符串的散列值对Memcached数据库进行分区(shard),由计算出的散列值决定用Memcached集群中的哪台服务器来存储特定的记录。
- 当使用电子邮箱地址在网站注册账号时,通常会立刻返回一个页面,请于邮件收件箱内查收确认邮件。在这一过程中,用户无需等待,而网站通过我们的电子邮箱服务提供商传输邮件则可能需要好几分钟的时间。网站的通常做法是将电子邮箱地址放在一个消息队列里,当后台服务器准备好建立一个用于发送的SMTP连接时,就会从消息队列中获取邮箱地址。如果发送暂时失败,那么电子邮箱地址会被直接放回到队列中,在经历更长的时间间隔后重试。
消息队列可以作为自定义远程过程调用(RPC,Remote Procedure Call)服务的基础。远程过程调用服务允许繁忙的前端服务器将一些困难的工作交给后端服务器来负责。前端服务器可以将请求置于消息队列中,几十甚至几百个后端服务器会对该消息队列进行监听。后端服务器在处理完消息队列中的请求后会将响应返回给正在等待的前端服务器。经常需要将一些大容量的事件数据作为小型的有效消息流集中存储在消息队列中并进行分析。在一些网站中,消息队列已经彻底代替了存储到本地硬盘中的日志系统以及syslog这样更古老的日志传输机制。
- 管道(pipeline)拓扑结构可能是与我们脑海中对于队列的直观映像最相似的一种模式:生产者创建消息,然后将消息提交至队列中,消费者从队列中接收消息。例如,一个照片分享网站的前端网络服务器可能会将用户上传的图片存储在一个专门用于接收文件的内部队列中。包含许多缩略图生成工具的机房会从队列中读取图片。每个图像处理服务器每次从队列中接收一条消息(消息中包含需要生成缩略图的图片),然后为其生成缩略图。站点较为繁忙时,队列在运行过程中可能会越来越长;站点较为空闲时,队列就会变短或是再次清空。不过,无论站点是否繁忙,前端网络服务器都可以直接向等待的客户端返回一个响应,告诉用户,上传已经成功,并且很快就能在他们的照片流中看到。
- 发布者-订阅者(publisher-subscriber)或扇出(fanout)结构看上去和管道结构差不多,不过二者有一个重要的区别。虽然管道结构的消息队列能够保证队列中的没个消息都会被发送给一个消费者(这是由于,把同一张图片发送给两台图像服务器毕竟是很浪费的),但是消息订阅者通常想要接收队列中的所有消息。因此另一种方法是,由订阅者设置一个过滤器,通过某种特定的格式限定有兴趣的消息范围。该类型的队列可以用于需要向外部世界推送事件的外部服务。服务器机房同样可以使用队列系统来对哪些系统启动了,哪些系统因为维护而关闭进行通知。除此之外,甚至还可以使用这种队列系统在其他消息队列创建和销毁的时候发布他们的地址。
- 最后一个是请求-响应(request-reply)模式,这也是最为复杂的模式。复杂的原因在于消息需要进行往返。在前面两种模式中,消息生产者的工作是非常少的。生产者连接到队列,然后发送消息,仅此而已。但是,发起请求的消息队列客户端需要保持连接,并等待接收响应。为了支持这一点,队列必须提供某种寻址机制,从成百上千个已经连接并且仍然处于等待的客户端中找到正确的客户端,将响应发送到该客户端。不过也正是由于这一复杂性使得请求-响应模式几乎成为了最强大的模式。它允许我们将几十或是几百个客户端请求均匀分布到大量服务器中,除了设置消息队列外,不需要做其它任何工作。一个优秀的消息队列允许服务器在不丢失消息的前提下绑定到消息队列或解除绑定,因此这种拓扑结构的消息队列同样允许服务器在需要维护而关闭时的行为对客户端机器保持不可见。
Python网络编程 8 缓存与消息队列相关推荐
- 【LINUX/UNIX网络编程】之使用消息队列,信号量和命名管道实现的多进程服务器(多人群聊系统)...
RT,使用消息队列,信号量和命名管道实现的多人群聊系统. 本学期Linux.unix网络编程的第三个作业. 先上实验要求: 实验三 多进程服务器 [实验目的] 1.熟练掌握进程的创建与终止方法: 2 ...
- 读书笔记 - -《Python网络编程》重点
文章目录 一.前言 二.客户/服务器网络编程简介 三.UDP 3.1 端口号 3.2 套接字 3.3 UDP分组 3.4 小结 四.TCP 4.1 TCP工作原理 4.2 绑定接口 4.3 死锁 4. ...
- python网络编程内容_图解Python网络编程
Python Python开发 Python语言 图解Python网络编程 本篇索引 (1)基本原理 本篇指的网络编程,仅仅是指如何在两台或多台计算机之间,通过网络收发数据包:而不涉及具体的应用层功能 ...
- 【CSDN软件工程师能力认证学习精选】Python网络编程(socket编程)
CSDN软件工程师能力认证(以下简称C系列认证)是由中国软件开发者网CSDN制定并推出的一个能力认证标准.C系列认证历经近一年的实际线下调研.考察.迭代.测试,并梳理出软件工程师开发过程中所需的各项技 ...
- Python 全栈系列122 redis消息队列搭建
说明 不太喜欢rabbitmq之类的消息中间件,出问题不太好调试.打算使用redis替代. 内容 1 安装 1.1 版本 以docker方式安装,可以作为每台主机的一个标配.(其他的标配数据库还有mo ...
- python编程入门指南怎么样-学习python网络编程怎么入门
第一部分底层网络学习 Python提供了访问底层操作系统Socket接口的全部方法,需要的时候这些接口可以提供灵活而强有力的功能. (1)基本客户端操作 在<python 网络编程基础>一 ...
- python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)...
python网络编程基础(线程与进程.并行与并发.同步与异步.阻塞与非阻塞.CPU密集型与IO密集型) 目录 线程与进程并行与并发同步与异步阻塞与非阻塞CPU密集型与IO密集型 线程与进程 进程 前言 ...
- python网络编程案例_Python 网络编程_python网络编程基础_python高级编程
Python 网络编程 Python 提供了两个级别访问的网络服务.: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的 ...
- python 网络编程 问题记录
191223 python 网络编程 套接字的初使用 在本机配置服务端和客户端后,运行没问题:将服务端代码弄到另一台电脑上后启动,用原来的电脑去连接它,就连不上了,不知啥原因,是ip自动获取和指定ip ...
最新文章
- WebSocket学习与使用
- 如何解决文件明明存在nginx却提示404
- 51nod-有限背包计数问题【dp】
- python的read函数调用报错_从零开始学Python(七):文件存储I/O流和异常捕捉
- 计算机网络(一)——一些概念
- SQL Server 中 EXEC 与 SP_EXECUTESQL 的区别 及动态查询中的标识符函数QUOTENAME
- MFC学习日志(一)
- 基于汽车运动学模型的LQR控制
- Ubuntu离线安装curl
- CMOS传输门原理及应用
- 官网Tomcat下载方法(亲测)
- 量化交易奇才大卫·哈丁的投资之路
- lol提示游戏环境异常重启计算机,出现LOL游戏环境异常请重启机器怎么解决?
- 为什么你微信公众号的阅读量越来越低了?
- bash shell实现并发多进程操作
- [转载]利用Web Services实现软件自动升级
- 用vue-cli3+vue-video-player写了个高佣联盟推广网站
- 草图大师SketchUp绘图-定制亚克力外壳教程
- sql语句利用into outfile写入一句话
- 编程小白从头学习ACM竞赛入门打卡 day 1