消息队列Rabbitmq与Kafka对比分析

什么是消息队列

在计算机科学中,消息队列(英语:Message queue)是一种进程间通信或同一进程的不同线程间的通信方式,软件的贮列用来处理一系列的输入,通常是来自用户。消息队列提供了异步的通信协议,每一个贮列中的纪录包含详细说明的数据,包含发生的时间,输入设备的种类,以及特定的输入参数,也就是说:消息的发送者和接收者不需要同时与消息队列交互。消息会保存在队列中,直到接收者取回它。

实现

消息队列就是一个消息的链表。可以把消息看作一个记录,具有特定的格式以及特定的优先级。对消息队列有写权限的进程可以向中按照一定的规则添加新消息;对消息队列有读权限的进程则可以从消息队列中读走消息。消息队列是随内核持续的。

目前,有很多消息队列有很多开源的实现,包括JBoss Messaging、JORAM、Apache ActiveMQ、Sun Open Message Queue、RabbitMQ、IBM MQ、Apache Qpid、Apache Kafka和HTTPSQS。

AMQP与Rabbitmq

高级消息队列协议(AMQP)是一个异步消息传递所使用的应用层协议规范。作为线路层协议,而不是API(例如JMS2),AMQP客户端能够无视消息的来源任意发送和接受信息。现在,已经有相当一部分不同平台的服务器和客户端可以投入使用。

AMQP messaging 中的基本概念

  • Broker:

阅读全文

go docker与kubernetes实践

Go

Go(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。Go的语法接近C语言 + Python。

安装

下载Go 1.10.2 版本,可执行文件,解压安装,并配置bin环境变量

tar -C /usr/local -xzf go1.10.2.linux-amd64.tar.gz 
export PATH=$PATH:/usr/local/go/bin

创建go代码工作路径

mkdir /home/git/dh/go
阅读全文

使用ansible + git + python搭建部署系统

Ansible

ansible是个什么东西呢?官方的title是“Ansible is Simple IT Automation”——简单的自动化IT工具。这个工具的目标有这么几项:让我们自动化部署APP;自动化管理配置项;自动化的持续交付;自动化的(AWS)云服务管理,基于 paramiko 开发。 这个paramiko是什么呢?它是一个纯Python实现的ssh协议库。所以就不需要在远程主机上安装client/agents,因为它们是基于ssh来和远程主机通讯的。

安装

以centos为例

sudo yum install ansible

安装完成,配置文件默认在/etc/ansible/ansible.cfg 为了方便后续的开发,需要修改配置文件

#失败后不在本地生成retry文件,终端也不输出
retry_files_enabled = 
阅读全文

后端资源优化的一些小技巧

随着服务端流量的不断递增,对底层资源的依赖也越来越重,连接数增多,IO负载高等,很多性能瓶颈由此产生。下面主要谈谈DB/Redis/Mc这些核心资源的优化。

  1. DB DB的查询会触发磁盘IO,我们知道IO的代价是很高的,所以DB的优化主要从降低IO次数着手。

a. 优化慢查询 优化慢查询主要考虑从索引入手,众所周知,Innodb索引存储结构为B+树,真正的数据项只存在于叶子节点,所以要考虑降低树的查询长度,例如:有一表的列字段如下

`card` varchar(10) DEFAULT NULL,
UNIQUE KEY `idx_card` (`card`),
explain SELECT * FROM `table` WHERE 
阅读全文

后端的架构演进

1.互联网公司业务发展初期,没有较大流量,每日新增用户较少,技术团队核心点还是放在快速版本迭代,调研市场,开发新功能,以及配合一些活动、推广吸引新用户。所以业务初期,技术选型也比较简单。

对APP或WEB端来说,流量直接打到1台或多台ECS对应API,基于不同的业务场景,API会请求对应Nosql/缓存,或直接落到DB。

2.随着公司业务不断成型,用户的一步步累计,日活已经打到几十万甚至百万级别,初期的技术选型已经无法满足需求,ES及后端资源可能会频繁报警,这个时候就需要对已有的业务模型升级改造,由单机过渡到集群。

前端机会有SLB下的一组或多组ECS构成,SLB负责均衡外部流量,打到后端不同机器。对应的后端资源也会是主从集群模式,均衡单台CPU或内存过高而造成服务器无法响应。
除了资源的集群化,对应的业务也需要进行梳理改造,比如DB慢查,缓存、NoSQL滥用等等。
除此之外还要建立API及资源的安全化,比如API签名、加密,存储资源的有效期等等。
此阶段的主要任务是资源的合理化,减少对容易造成系统瓶颈资源的依赖,优化原有业务并制定新的开发规范,完善资源监控等等。

3.等到公司业务已经相对成熟,日活达到千万级别,市场良性循环建立,用户留存及新增用户都比较可观,这个时候架构升级就会偏向各个模块稳定性,后端各个模块会服务化,即微服务架构。

每个微服务模块相对隔离,有自己独立的一套资源(SLB, NOSQL, DB等),各个模块之间不会有过多耦合,最上层API会依据对应业务场景,组装或调用不同微服务模块。

此阶段的主要任务是保障可控,可监控、可扩展,减少模块之间相互依赖(包括逻辑依赖与资源依赖)。

各个微服务模块相对稳定之后,架构就要考虑平台化,比如账户体系,已经不单单是针对单一应用,要考虑SSO,OAuth等。媒资库也要考虑多端资源聚合等。

没有一成不变的架构,只有不断探索、优化,适当尝试新技术,才能打造一个稳定可靠的平台。 … 阅读全文