这篇文章是一篇未完成稿,有时间再写

什么是消息队列(Message Queue)?

消息队列使得应用之间可以通过互发消息的方式来通信,这和传统的RPC方式有很大的区别。通过消息队列提供的服务,解除了点对点,星形拓扑通信耦合的问题。同时,当目标服务不可用的时候,消息队列充当了临时的消息缓存。

下面先解释一下什么是消息队列[1],怎么使用,在架构层面又会带来什么样的好处[2]

队列就是将事物排成一列,依次处理,并且依照先进先出(First In, First Out)的顺序。那么消息队列(MQ),就是用于不同系统或者应用之间通信的的列表, 将需要通信的消息保存在队列中,等待应用依次处理。queues.io是一个比较好的网站可以查找各种不同功能的队列。

阅读全文 »

调研结果和建议

综合来看,Avro或者Protocol Buffer二选一即可, 但是出于灵活性和标准JSON的支持力度上来看,更推荐Protocol Buffers。同时部分数据依然可以通过JSON方式传输。

主流序列化框架对比

Kafka的序列化

Kafka并不限定的消息格式。Kafka自身提供了一系列的序列化器,比如ByteArraySerializer,ByteBufferSerializer,DoubleSerializer,FloatSerializer,StringSerializer,UUIDSerializer, IntegerDeserializer, LongSerializer, ShortSerializer, 总结起来就是基本类型、字符串类型、二进制消息。

但是在通常情况下不会使用比如Float这种来做序列化,原因在于系统间交互或者放到Kafka的数据一般来说都比较复杂,无法用一个字段来表示。于是,这种情况下,就需要在Kafka之上建立一个消息格式的契约,以便于Kafka的生产者和消费者之间都能理解消息中的语义。最好地方就是在Kafka基础之上增加一层应用层的消息协议,比如JSON格式、比如二进制编解码协议(序列化),出于性能考虑,一般也不直接使用Java POJO对象的原生序列化(虽然可行)。在Apache Spark中使用的Kryo Register,由于场景限制(不提供IDL定义),不适用Kafka。

下面对常见的几个序列化框架做一个横向对比:

阅读全文 »

占坑,后面有时间对Kafka进行详细的更新

A bit of History

Kafka是高性能的、分布式的、数据可持久化的消息丢列。最初由LinkedIn开发,用来跟踪Web上的用户的一系列事件,譬如页面浏览(Page view),搜索框的输入,展示的广告等等。这些事件对于监控和调查用于对于网站交互的参与度非常的重要。每天都有大量的数据产生,因为,需要一个可以轻松扩展,同时又不会增加额外负担的一个解决方案。

总体来说,Kafka从设计之初有3个目标:

  1. 简单的生产者/消费者API设计
  2. 尽可能减少网络传输和磁盘存储的额外成本
  3. 从一开始就为可扩展性而设计
阅读全文 »

调研结果和建议

针对是否可以跨数据中心部署Kafka集群的问题,答案是可行,但是不建议。建议先支持单集群部署,以简化运维成本,支持多地多应用业务上线。

可行性与跨网络部署产生的问题

Kafka实际上并不禁止将Broker部署到不同的网络地域。但是,Kafka的设计是按照单个数据中心进行设计、开发、测试和调优的。从Kafka的官方文档[1]来看,并不推荐将集群跨网络部署。 由于Broker分布在不同的跨地域的网络(WAN), 除了数据同步会极大地增加延迟之外, 并且如果由于网络中断无法保证zk始终可用,带来其他问题,比如:

  1. Partition Leader无法选举。或者由于网络问题,某个Broker频繁掉线导致集群不稳定。
  2. 在Producer推送数据时候,产生延迟(推送到remote Broker)。或者由于网络问题,无法获取ACK。
阅读全文 »

什么是Thrift?

Thrift是一种接口描述语言和二进制通讯协议,它被用来定义和创建跨语言的服务。它被当作一个远程过程调用(RPC)框架来使用,是由Facebook为“大规模跨语言服务开发”而开发的。它通过一个代码生成引擎联合了一个软件栈,来创建不同程度的、无缝的跨平台高效服务,可以使用C#、C++(基于POSIX兼容系统)、Cappuccino、Cocoa、Delphi、Erlang、Go、Haskell、Java、Node.js、OCaml、Perl、PHP、Python、Ruby和Smalltalk。虽然它以前是由Facebook开发的,但它现在是Apache软件基金会的开源项目了。该实现被描述在2007年4月的一篇由Facebook发表的技术论文中,该论文现由Apache掌管。

目前流行的服务调用方式有很多种,例如基于 SOAP 消息格式的 Web Service,基于 JSON 消息格式的 RESTful 服务等。其中所用到的数据传输方式包括 XML,JSON 等,然而 XML 相对体积太大,传输效率低,JSON 体积较小,新颖,但还不够完善。本文将介绍由 Facebook 开发的远程服务调用框架 Apache Thrift,它采用接口描述语言定义并创建服务,支持可扩展的跨语言服务开发,所包含的代码生成引擎可以在多种语言中,如 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk 等创建高效的、无缝的服务,其传输数据采用二进制格式,相对 XML 和 JSON 体积更小,对于高并发、大数据量和多语言的环境更有优势。本文将详细介绍 Thrift 的使用,并且提供丰富的实例代码加以解释说明,帮助使用者快速构建服务。Thrift的下载地址是:http://thrift.apache.org/download

thrift.exe支持的参数有哪些?

阅读全文 »

原作者: 保罗▪福特 2015年2月11日
译者: 山野@成都 2017

在阅读之前

这篇文章[1]是我在2017年在麻省理工评论(MIT Technology Review)上看到的翻译的。 作者是保罗▪福特[2]。距离当初的翻译已经过去了2年。现在人工智能的概念已经深入到各行各业,从大家经常接触的SNS社交数据挖掘、智能客服、B2C商品推荐系统、新闻推荐系统、智能汽车,以及到更广泛的更偏向于传统的领域,比如医疗、城市规划、交通领域、建筑领域、社区管理、行政服务等等的一切都在提到一个词,那就是“智慧”,“智能”。

这一切的背后都和机器学习技术(深度学习、加强学习)等等的兴起,以及更加容易使用的框架和API,比如谷歌的tensorflow;更加容易处理大规模数据的框架,比如Apache Spark、Apache Hadoop套件等,这些都助力于并提高了各种业务对于基于大量数据的建模和预测能力。而这些能力就是大家所说的人工智能。

下面这篇文章并没有讲解具体的某种应用于人工智能的技术,而是从更高更抽象的层面,从社会和伦理的层面探讨了人工智能所带来的一些问题。

下面是正文:

阅读全文 »

通过maven自动化构建protocal buffer

当对代码进行工程构建的时候,如果能够尽可能的自动化,这样对于提升整个软件质量、节省人力成本、减少因为人工干预导致的各种不可预知的错误是很好。
从protobuf的官方文档来看,通过cmd调用protoc当然可以生成相应的代码,但是对构建不够友好。于是,可以考虑通过maven来进行自动化构建,在启动maven构建的时候,自动调用protoc,生成代码,并打包成相应的jar包,集成到工程发布包中。
这里有2种方式,如下。

阅读全文 »

RPM

RPM是Red-Hat Package Manager(RPM软件包管理器)的缩写,这一文件格式名称虽然打上了RedHat的标志[1],但是其原始设计理念是开放式的,现在包括OpenLinux、S.u.S.E.以及Turbo Linux等Linux的分发版本都有采用,可以算是公认的行业标准了。

apt-get

apt-get[2],是一条linux命令,适用于deb包管理式的操作系统,主要用于自动从互联网的软件仓库中搜索、安装、升级、卸载软件或操作系统。主要适用于Debian、Ubuntu的系统。

阅读全文 »

maven从设计上来说非常的简单,但是却是一个非常强大的工具。很多人将maven只是当做一个构建工具(从源代码生成可运行软件),但是实际上可以将maven当做一个项目管理工具,比如工程管理、插件管理、Jar包依赖管理、软件发布仓库管理等。

下面讲解一些在使用maven当中所遇到的一些小的技巧。

阅读全文 »

Nodejs、Express、Socket.io、Nginx

使用Express框架和Socket.io库将websocket搭建起来,并监听同一个端口,参考官方例子[1]就可以,非常简单。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);

server.listen(80);
// WARNING: app.listen(80) will NOT work here!

app.get('/', function (req, res) {
res.sendFile(__dirname + '/index.html');
});

io.on('connection', function (socket) {
socket.emit('news', { hello: 'world' });
socket.on('my other event', function (data) {
console.log(data);
});
});

Nginx同时作为Web Server和WebSocket Reverse Proxy

在配置Nginx的时候,遇到了很多的问题,并且在网上现在找不到一篇对这个问题讲解的非常清楚的文档。
比如:

阅读全文 »
0%