#队列及协议
**队列用途**
1、生活中的队列 共享打印机 银行取号
2、程序中的队列 发短信、邮件、上传照片、朋友圈推送
**通信模型**
1、点对点
2、广播
3、组播
4、请求、响应
5、发布、订阅
##程序中的两种队列
1、消息队列
只处理消息传递:MessageQueue 一头存储,另一头取数据
2、任务队列
任务队列工具:Gearman(JobTask) 一边写入任务内容,一边完成任务
**队列中的角色**
1、生产者
2、消费者
3、服务器
4、客户端
消费了是否还存在?
##队列用途和特点
1、异步处理数据传递和存储
2、大并发时起缓冲作用
3、解耦合
4、可扩展
##队列协议
协议是通信约定,数据交换标准
1、socket协议
2、http协议
协议和语言绑定吗?
# 开源队列使用
##mx-queued
C语言高性能开源消息队列服务器
1、延时队列
2、优先队列
3、持久化
mx-queued安装
https://github.com/liexusong/mx-queued
需要安装lua: yum install • lua lua-devel 如果还make失败,修改Makefile, 下面这一行加上
-lpthread CFLAGS?= -std=c99 -pedantic -O2 -Wall -W - DSDS_ABORT_ON_OOM -llua -lm -ldl –lpthread make成功, 生成mx-queued文件
启动: • ./mx-queued • &
##mx-queued使用
include_once('mx_queued.php');
$queue = new mx_queued('182.254.145.235');
$job • = • 'sendmsgto';
$re • = • $queue->enqueue('class_msg', • 1, • 0, • $job);
##Socket队列
###Socket = client ip + client port + server ip + server port
Socket本身不是协议
Socket提供针对TCP或UDP编程接口
##HTTPSQS队列
1、基于HTTP GET/POST
2、非常快速,入出队列速度10000次/秒
3、支持上万并发
4、支持多队列
5、单个队列支持最大10亿条,低内存
##HTTPSQS安装和使用
1、安装 libevent、tokyocabinet、httpsqs
2、默认启动1218端口 httpsqs -x /var/software/data
3、入队列
curl http://host:port/?name=queue_name&opt=put&data=xxx 4、出队列
curl http://host:port/?charset=utf- 8&name=queue_name&opt=get
##ActiveMQ
1、Apache出品
2、完全支持JMS1.1和J2EE 1.4规范的JMS Provider实现
3、启动端口5672连接61613,web端口8161
sh bin/activemq-admin start
4、使用
AMQP
Stomp
##Qpidd
1、AMQP
Advanced Message Queuing Protocol,即高级消息队列协议。AMQP 是一个标准化的消息中间件协议。让不同语言, 不同系统的应用互相通信, 并提供一个简单统一的模型和编程接口
2、Qpid是AMQP的实现,Apache开发的一款面向对象的消息中间件
3、Qpid提供了C++/Python/Java/C# 等主流编程语言的客户端库,安装 使用非常方便
4、Qpid提供了很多额外的HA特性,非常适于集群环境下的消息通信
5、Qpidd是服务器端(Broker),有CPP和Java版
##Qpidd使用
qpid-cpp-0.30/build/src ./qpidd
openstack引用
##网络消息队列服务
1、AWS
http://aws.amazon.com/cn/sqs/
AWS免费套餐包含100 万个Amazon Simple Queue Service(SQS)请求
2、阿里云消息队列服务MQS http://www.aliyun.com/product/mqs
需申请公测资格才能开通
3、LeanCloud(原AvosCloud)
http://www.leancloud.cn
基本使用免费
# 开发自己的队列
自定义队列
使用别人队列可能的问题:
1、不能一次取多个消息
2、不好维护、备份
3、不能自定义日志
通过自己开发队列了解本质
##自定义协议
队列不一定只能在本地调用
自定义协议网络调用
# 分布式缓存与Hash
##NoSQL定义
1. Not Only SQL
2. Non-relational
##NoSQL定义
为什么会出现NoSQL?
文件缓存
MySQL 外部查询缓存 有效期控制、过期文件清理、分布式环境
Session 存储
##CAP原则:分布式系统的三个核心需求
1. Consistency 数据一致性
原子性或者事务性
2. Availability 可用性
用户体验良好,不会出错或延迟
3. Partition Tolerance分区容错性
扩展性和容错性,容易扩展机器,一台机器出错不影响业务正常运行
![](https://box.kancloud.cn/2016-05-06_572c68b5e1c7a.png)
不能同时满足三个需求
同一套系统很难同时满足三个需求,需要组合各种技术
放弃某个需求有时是合理的,一致性需求讨论
用户评论 商品价格
##传统关系型DB:一致性、可用性
###容错和扩展成本高 程序是面向对象,DB是面向关系,ORM效率低下 表结构变化频繁
**表字段是复杂类型 高并发数据库请求**
**海量数据分布式存储**
##NoSQL特点
###易扩展
去掉关系型数据中的关系,非常容易扩展
###大数据量、高性能
结构简单,细粒度cache
###灵活的数据模型
随时添加存储自定义结构数据
##NoSQL类型:适合什么场景
1.Key-value 键值
Memcached、Redis
2.Document-Oriented 面向文档
Mongodb
3.其他:列存储、图、xml存储
HBase、Neo4J
1.Key-value 键值
适合:和id关联,例如session、cache、配置信息、订单
不适合:按值查询、key关联、事务
2.Document-Oriented 面向文档
适合:日志、结构化数据、变化频繁
不适合:事务、细化权限、低配置机器
3.其他:列存储、图、xml存储
特殊用途:用图来做推荐引擎,用列存储app日志数据内容
##Memcached特点
1、采用不互相通信的分布式(客户端分布式) 2、基于libevent事件机制,主线程负责分发 3、slab算法分配内存:memcached -vv查看内存分配
每次申请1M内存,分成不同的区块,区块大小1.25倍递增 4、访问时才删除过期数据
5、内存不足LRU淘汰数据
a)FIFO(First In First Out) MySQL
b)LFU(Less Frequently Used)
c)LRU(Least Recently Used) Memcached、Redis
![](https://box.kancloud.cn/2016-05-06_572c68b624daa.png)
![](https://box.kancloud.cn/2016-05-06_572c68b6652b1.png)
##Hash算法
1、普通hash求余
2、times33算法:Apache、php、perl unsigned long time33(char const *str, int len) {
unsigned long hash = 5381; //php版本初始值 for (int i = 0; i < len; i++) {
hash = ((hash << 5) + hash) + (unsigned long) str[i]; }
return hash; }
3、冲突:拉链法保存链表
# Redis等NoSQL使用
##Memcached与Redis
###Memcached
稳定
内存缓存,不需要考虑备份
###Redis
可以持久化 支持复杂结构,list、sortedset等 支持主从,查询:slaveof 192.168.1.1 6379 支持虚拟内存,key不存虚拟内存
##Redis安装
下载
http://redis.io
安装与工具
安装:make && make install
启动:redis_server &
测试:telnet 或者 redis_cli
命令行,set、get、incr、quit
性能:redis_benchmark
安装phpredis扩展
phpize 源码安装
##数据类型
###String、List、Set、Sorted Set、Hash
list:我关注的列表 set:用户名已注册 sorted set:排序队列 hash:用户对象
示例
###Instagram
3亿张照片
存储 照片ID -> 主人UID
要求全部加载到内存中 EC2 17GB
SET media:1155315 939 GET media:1155315
> 939
Result: 21GB
hash-zipmap-max-entries = 1000
HSET "mediabucket:1155" "1155315" "939" HGET "mediabucket:1155" "1155315"
> "939"
Result: 5GB
###Redis实战
1、分布式session
session.have_handler session_set_save_handler(open,close,read,write,destroy,gc)
2、实现队列 结合SQL,微博发表评论 和mysql性能对比
3、pipeline
##MongoDB安装
###下载
http://mongodb.org
###安装与工具
安装:解压即可
启动:bin/mongod --dbpath=/home/ucai/local/mongodb_data/ -- syslog &
测试:bin/mongo
###安装php扩展
phpize 源码安装
###Mongodb示例
1.基本使用
类SQL操作
show dbs; use ucai; db.ucai.insert(); db.ucai.find(); db.ucai.find(); db.ucai.update();
2.性能对比测试
和MySQL性能对比
##说明
SQL与NoSQL并没有明显界限 相同的功能可能都能实现,但是侧重点不同 通过不同方式甚至都能达到相同的性能
##选择SQL还是NoSQL
SQL的重点是关系型数据,事务和数据可靠性
稳定
NoSQL的重点是性能(分布式场合),结构化数据,易扩展和维护 为了少量的性能而迁移到NoSQL也许是不值得的
组合使用
- SWOOLE及php网络编程
- LNMP架构与Socket,http协议
- 如何高效学习
- 开发工具箱
- 编写高效的js
- js闭包编写全功能的购物车
- JSON和JSONP
- 多级分类的开发与应用
- 设计安全的登录注册流程
- 前端性能优化
- 前端架构优化
- 使用第三方云服务加速产品开发
- 移动互联网之API开发
- php分层
- 全文检索的实践与部署
- webIM的原理及前后端实现
- 如何配置高效的数据库以及MySQL的代码及插件开发
- NoSql.队列,任务队列
- 构建本机缓存,构建分布式缓存池
- 数据库分库分表的设计
- Nginx原理及模块开发初步
- 无限扩充的数据库架构
- php构建分库分表分布式数据库连接池
- 静态文件上传、分布式存储与分发
- MySQL Cluster,Proxy分析与实践
- 架构解密