服务器在负载较重时使用的基本技术:缓存&消息队列
前边的章节介绍了套接字API,Python中使用基础IP网络操作构建信道的方式
之后将讨论构建在套接字上的特定协议
编写优雅的服务,解决特定的问题——机构内部特有的
HTTP针对特定的负载设计(超文本文档)
Memcached:内存缓存守护进程。结合服务器上的空闲RAM与LRU(last recently use)缓存
使用Memcached
在每台空闲内存的服务器上运行Memcached进程
Memcached守护进程的IP地址与端口号列出(列表)——发送给所有将使用Memcached的客户端
客户端可以访问一个组织极的,速度极快的键值缓存(Python字典)
目的:将重复计算,花销大的计算结果保存
数据库查询,文件系统读写,外部服务读写
决定信息在缓存中的保存时间
重启后丢失
脏数据:
1.设定过期时间
2.信息标识到包含标识的键的映射
3.记录不可用:覆写,而不是删除。程序首次启动时预安装缓存
装饰器实现缓存
8.2 散列与分区
当Memcached客户端包含了多个Memcached实例的列表,会根据每个键的字符串值的散列值对Memcached数据库进行分区。
计算出的散列值决定使用集群中的具体服务器
避免冗余,避免不同服务器之间的协同操作
解决方案:所有服务器实现相同的稳定算法
消除原数据的分布规律(随机),避免依赖输入数据中的模式。模式消除
8.3消息队列
允许发送可靠的数据块——消息。保证消息可靠自动传输。
负责封帧
TCP:基于IP点对点
消息队列:允许多个拓扑结构
可作为自定义远程过程调用服务(RPC)的基础
前端服务器将工作交给后端服务器完成:前端将请求加入消息队列,后端监听消息队列,处理请求返回响应
集中存储小型有效消息(大容量事件数据)
具有混合安排并匹配所有客户端与服务器的能力。并连接到同一消息队列。
单一目的的机器,将机器集合到集群,共同提供某个服务。
拓扑结构:
管道:生产者,消费者
发布者,订阅者
请求,响应:消息需要往返,保持连接。队列需要提供寻址模式
允许服务器绑定,解绑
大量运行多个轻量级线程,与数据库客户端、文件服务器连接。
最流行的消息队列:被实现为独立的服务器
所有组件绑定到消息队列:生产者,消费者,过滤器,RPC服务
AMQP协议:跨语言消息队列协议
每个线程创建一个或多个用于通信的套接字,试图让两个线程共享一个消息套接字:不安全
线程间共享共同上下文对象(context)保证所有线程存在于同一个URL和消息队列空间内
消息机制隐式的为请求自动添加返回地址供代理完成后返回
实际情况:保证无法处理的消息被持久化保存。
流量控制,保证速度慢的时候也能处理消息队列中的消息。