多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
#队列及协议 **队列用途** 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也许是不值得的 组合使用