RabbitMQ

组成 Server(broker): 接受客户端连接,实现AMQP消息队列和路由功能的进程。 Virtual Host: 其实是一个虚拟概念,类似于权限控制组,一个Virtual Host里面可以有若干个Exchange和Queue,但是权限控制的最小粒度是Virtual Host Exchange: 接受生产者发送的消息,并根据Binding规则将消息路由给服务器中的队列。ExchangeType决定了Exchange路由消息的行为,例如,在RabbitMQ中,ExchangeType有direct、Fanout和Topic三种,不同类型的Exchange路由的行为是不一样的。 Message Queue:消息队列,用于存储还未被消费者消费的消息。 Message: 由Header和Body组成,Header是由生产者添加的各种属性的集合,包括Message是否被持久化、由哪个Message Queue接受、优先级是多少等。而Body是真正需要传输的APP数据。 Binding: Binding联系了Exchange与Message Queue。Exchange在与多个Message Queue发生Binding后会生成一张路由表,路由表中存储着Message Queue所需消息的限制条件即Binding Key。当Exchange收到Message时会解析其Header得到Routing Key,Exchange根据Routing Key与Exchange Type将Message路由到Message Queue。Binding Key由Consumer在Binding Exchange与Message Queue时指定,而Routing Key由Producer发送Message时指定,两者的匹配方式由Exchange Type决定。 Connection: 连接,对于RabbitMQ而言,其实就是一个位于客户端和Broker之间的TCP连接。 Channel: 信道,仅仅创建了客户端到Broker之间的连接后,客户端还是不能发送消息的。需要为每一个Connection创建Channel,AMQP协议规定只有通过Channel才能执行AMQP的命令。一个Connection可以包含多个Channel。之所以需要Channel,是因为TCP连接的建立和释放都是十分昂贵的,如果一个客户端每一个线程都需要与Broker交互,如果每一个线程都建立一个TCP连接,暂且不考虑TCP连接是否浪费,就算操作系统也无法承受每秒建立如此多的TCP连接。RabbitMQ建议客户端线程之间不要共用Channel,至少要保证共用Channel的线程发送消息必须是串行的,但是建议尽量共用Connection。 Command: AMQP的命令,客户端通过Command完成与AMQP服务器的交互来实现自身的逻辑。例如在RabbitMQ中,客户端可以通过publish命令发送消息,txSelect开启一个事务,txCommit提交一个事务。 原理 producer发布消息到exchnage,由exchange转发给quenue,consumer者再消费queue 场景 单发单收 单发多收 发布、订阅模式,发送端发送广播消息,多个接收端接收 Routing (按路线发送接收) Topics (按topic发送接收) exchange direct 如果routing_key匹配,消息就被投递到对应队列上 fanout 不处理routing_key,将消息广播到所有绑定的队列上,消息传播最快 topic 将路由键和某模式进行匹配,将不同源头的消息投递到同一个队列上 headers 允许匹配消息的header而非routing_key vhost 持久化 管理 使用rabbitmqctl进行管理 待续…

2017年3月5日 · 3 分钟 · Bug1024

TCP握手

连接建立过程 TCP 连接的建立采用客户服务器方式,主动发起连接建立的一方叫客户端(Client),被动等待连接建立的一方叫服务器(Server)。 最初的时候,两端都处于 CLOSED 的状态,然后服务器打开了 TCP 服务,进入 LISTEN 状态,监听特定端口,等待客户端的 TCP 请求。 ...

2017年2月1日 · 4 分钟 · Bug1024

书单

PHP 《PHP最佳实践》 《PHP开发者实践》 《PHP核心技术与最佳实践》 《PHP扩展开发及内核应用》 《深入理解PHP内核》 Java 《大型网站系统与Java中间件实践》 《Effective Java》 《深入分析Java Web技术内幕》 《深入理解Java虚拟机》 《Netty权威指南》 JS 《JavaScript高级程序设计(第3版)》 《JavaScript语言精粹》 《精通JavaScript开发》 《深入浅出Node.js》 DB 《MySQL技术内幕:SQL编程》 《MySQL技术内幕:InnoDB存储引擎》 Linux 《高级Bash脚本编程指南》 《Linux工具快速教程》 《UNIX环境高级编程》 Nginx & Lua 《Nginx开发从入门到精通》 《agentzh的Nginx教程》 《OpenResty最佳实践》 《Lua源码欣赏》 C 《C程序设计语言 第2版·新版》 《Learn C The Hard Way》 ElasticSearch 《Elasticsearch权威指南》 《ELK中文指南》 MQ 《RabbitMQ实战》 Tool 《Git教程》 《Wireshark用户手册》 Others 《卓有成效的程序员》 《安全技术大系:Web前端黑客技术揭秘》 《高效团队开发 工具与方法》 《API Design Principles》 《全栈增长工程师实战》 《代码整洁之道》 《大型分布式网站架构设计与实践》 《淘宝技术这十年》 《程序员的自我修养—链接、装载与库》

2017年1月11日 · 2 分钟 · Bug1024

网站架构

海量数据存储 分库表基础上,单master多slave横向扩展 master和slave通过binlog近乎实时同步,任意slave可为master实时备份 主业务和辅业务模块数据库分离 多地部署,一处写入多出读取,保证就近读取 架构模式 分层:横向切分 分割:纵向切分 分布式:分层和分割的主要目的是为了切分后的模块便于分布式部署。常用方案: 分布式应用和服务 分布式静态资源 分布式数据和存储 分布式计算 分布式配置 分布式锁 分布式文件 集群:多台服务器部署相同的应用构成一个集群,通过负载均衡设备共同对外提供服务 缓存:将数据放距离计算最近的位置加快处理速度,改善性能第一手段,可以加快访问速度,减小后端负载压力。使用缓存 两个前提条件 :1.数据访问热点不均衡;2.数据某时段内有效,不会很快过期 CDN 反向代理 本地缓存 分布式缓存 异步:旨在系统解耦。异步架构是典型的消费者生产者模式,特性如下: 提高系统可用性 加快网站访问速度 消除并发访问高峰 冗余:实现高可用。数据库的冷备份和热备份 自动化:包括发布过程自动化,自动化代码管理,自动化测试,自动化安全检测,自动化部署,自动化监控,自动化报警,自动化失效转移,自动化失效恢复,自动化降级,自动化分配资源 安全:密码,手机校验码,加密,验证码,过滤,风险控制 核心要素 性能(Performance) 可用性(Availability) 伸缩性(Scalability) 扩展性(Extensibility) 安全性(Security) CAP 基于水平扩容能力和成本考虑,传统的强一致的解决方案(e.g.单机事务)纷纷被抛弃。其理论依据就是CAP原理,往往为了可用性和分区容错性,忍痛放弃强一致支持,转而追求最终一致性。 ...

2017年1月8日 · 7 分钟 · Bug1024

Redis

特点 高性能Key-Value存储 丰富的数据结构:string、list、hash、set、zset、hypeloglog 支持数据过期:主动过期+惰性过期 支持多种LRU策略:volatile-lru、volatile-ttl 等 内存管理:tcmaloc、jemalloc 内存存储+磁盘持久化: rdb、aof 支持主从复制 单线程 配置 aof配置 ...

2017年1月5日 · 3 分钟 · Bug1024

Qconf

360开源的一款分布式配置管理工具 相关链接 原理 GitHub 特点 一处修改,所有机器实时同步更新 高效读取配置 安装部署方便,使用简单 服务器宕机、网络中断、集群迁移等异常情况对用户透明 支持c/c++、shell、php、python、lua、java、go、node 等语言 服务端 QConf使用ZooKeeper集群作为服务端提供服务 单条配置直接存储在一个ZNode上 利用ZooKeeper的Watch监听功能实现配置变化时对客户端的及时通知 客户端 获取:查共享内存,无记录则向消息队列中加入请求,agent感知消息队列,agent查ZK并更新共享缓存 更新:ZK通知agent变更,agent从ZK中获取新值同时更新共享内存 设计目标:降低与ZooKeeper的链接数,本地缓存,及时更新,容错 特点:无锁,单点写,父子进程keepalive,落盘数据维护 管理端 业务修改配置的管理界面

2017年1月2日 · 1 分钟 · Bug1024

2016年总结

今年是让我感觉过的最快的一年,发生的种种事情仿佛就在昨日。 既然是一年的总结那么就写个全面的一点的,包括工作,学习,生活。 作为一个程序员我原本计划这次年终总结应该花更多笔墨在技术编程上,但思考一番后却发现过去一年在技术领域上并没有什么值得写的。 ...

2017年1月1日 · 3 分钟 · Bug1024

过去两年

毕业不知不觉已经两年半了,原本国庆节的时候就应该写这个总结的,现在已经是十二月份了,此时的我已经辞去了第一份工作,一路北上,加入了北漂一族。 专业选择 高考成绩并没有很理想,选择专业的时候也完全即兴发挥,后面才发现自己选的几个专业都在一个院系里,都是计算机相关的。 ...

2016年12月12日 · 2 分钟 · Bug1024