#隊列及協議
**隊列用途**
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分區容錯性
擴展性和容錯性,容易擴展機器,一臺機器出錯不影響業務正常運行

不能同時滿足三個需求
同一套系統很難同時滿足三個需求,需要組合各種技術
放棄某個需求有時是合理的,一致性需求討論
用戶評論 商品價格
##傳統關系型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


##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分析與實踐
- 架構解密