中间件
一 铭
公众号:大数据架构师修行之路
展开
-
Kafka介绍
Kafka简介Apache Kafka是一个分布式消息发布-订阅系统。他最初由LinkedIn开发,后来成为Apache项目的一部分。Kafka是快速、可扩展、分布式的。 和其他消息系统(ActiveMQ、RabbitMQ、ZeroMQ等)相比,Kafka有以下优点:分布式系统设计,很容易扩展对于消息的发布和订阅都有非常高的吞吐量支持多用户订阅,在消费失败时自动平衡多个消费者Kafka的逻原创 2017-06-13 12:09:48 · 1112 阅读 · 0 评论 -
Beanstalkd源码分析--use命令的实现
概述本文讲述了beanstalkd中use命令和list_used命令的实现原理。分析了保存tube的存储结构,和查询tube时的具体操作。并分析了这样实现的优缺点。引子前面已经讲解过命令的处理流程,本章直接进入use命令的实现部分。 就像数据库,在使用时需要先选择一个数据库的名字。在beanstalkd中也需要指定一个tube的名字。具体的指定操作是通过use命令来实现的。要注...原创 2018-08-21 14:50:41 · 425 阅读 · 0 评论 -
Beanstalkd源码分析—delete命令的实现
概述本文讲述delete命令的实现原理。delete命令介绍delete命令是:从队列中删除一个job。其命令格式如下:delete <id>\r\nid:为job id 响应 DELETED\r\n 删除成功 NOT_FOUND\r\n job不存在时,或者job的状态不为ready和buried(这种情况是在job执行超时之前,client发送...原创 2018-08-31 22:12:14 · 544 阅读 · 0 评论 -
Beanstalkd源码分析—release命令的实现
概述本文分析了beanstalkd的release命令的实现原理。release命令的说明功能说明release命令将一个reserved的job放回ready堆中。它通常在job执行失败时使用。命令行说明release <id> <pri> <delay>\r\nid:为job idpri:为job的优先级de...原创 2018-08-29 10:29:19 · 586 阅读 · 0 评论 -
Beanstalk源码分析--数据结构设计
概述beanstalk是多年前使用过的一个分布式任务队列,通过C实现,十分高效。和Redis(默认)的事件驱动框架一样,都是通过异步的epoll来实现,所以,能够高效的处理大量请求。 但不知什么原因,作者几年前已经不再维护其代码了。但我发现国内还是有一些人在使用该软件,为了能够更好的理解其运行机制,几年前对其代码进行了一些研究。先把分析的几篇发出来。 另外,我对其代码进行了fork,若有问...原创 2018-07-31 07:17:51 · 720 阅读 · 1 评论 -
Beanstalkd源码分析—touch命令的实现
概述本文讲述beanstalkd touch命令的实现原理。touch命令说明该命令允许消费者(worker)请求更多的时间执行job,当需要预留更多的时间来执行该jog是,该命令很有用。消费者(worker)可用周期的告诉服务器它仍然在执行job。touch命令的格式如下:touch <id>\r\n参数说明 id:为job id 响应 T...原创 2018-08-29 13:02:39 · 412 阅读 · 0 评论 -
Beanstalkd源码分析—事件超时的处理
概述在多路复用的网络编程中,比如select,epoll,poll等,往往会等待一定的时间,来允许读,写,异常的事件发生。当超时还没有事件发生时,会完成一定的处理任务。而超时处理的任务也非常重要。 本文介绍beanstalkd的超时处理部分的实现原理。进入超时处理在beanstalkd中,事件超时的处理在prottick函数中完成。前面的文章分析过命令处理流程,我们再来看一下事件...原创 2018-09-02 14:14:14 · 633 阅读 · 0 评论 -
Beanstalkd架构设计优缺点分析
概述本文从系统设计角度分析beanstalkd的优缺点,对beanstalkd的设计进行总结。优点的总结beanstalkd是基于内存的任务队列,性能较高。每个job有多种状态,状态之间可以相互转换。这些状态为job的使用者提供了使用的方便。在网络事件驱动方面,使用异步,高效的epoll作为事件驱动框架,但使用的是单线程模式。类似于数据库,beanstalkd把job保存在t...原创 2018-09-02 14:16:01 · 1889 阅读 · 0 评论 -
kafka原理分析—broker总体架构和启动流程
概述本文分析了kafka的broker的实现架构,通过本文的分析,我们可以对broker的实现架构的各个部分有一个总体的了解。实现broker的总体架构图下图是broker内部的总体架构图(该图来自于kafka官方的设计文档):从图中可以看出,kafka系统是由若干子系统构成。根据核心的功能模块,可以大体划分成以下几个子系统:客户端连接请求处理服务客户端指令处理服务日志管理子系统...原创 2019-01-18 13:49:00 · 1674 阅读 · 3 评论 -
kafka原理分析—网络层的实现原理分析
概述本文分析kafka网络层的实现原理。通过这篇文章我们可以对kafka broker的系统架构有一个整体的概念。这篇文章着重介绍kafka网络层的实现原理。网络层功能介绍kafka中网络层的主要功能是:监听客户端的连接请求,和客户端建建立网络连接;和客户端建立连接后,启动处理线程,接收客户端的命令请求;把客户端的请求发送给消息处理子系统;kafka网络层实现原理分析和很多高...原创 2019-01-18 23:55:12 · 639 阅读 · 0 评论 -
Beanstalkd源码分析—peek命令的实现
概述本文描述了beanstalkd中peek命令的实现原理。peek命令的说明该命令让client在系统中检查job,若存在则返回该job结构体,否则返回NOT_FOUND。 有四种形式的命令,其中第一种形式的指令是针对当前使用的tube格式。peek <id>\r\n 返回id对应的jobpeek-ready\r\n 返回下一个ready jobpee...原创 2018-08-31 06:14:18 · 660 阅读 · 0 评论 -
Beanstalkd源码分析—reserve命令实现
概述本文分析了beanstalkd的reserve命令的实现原理。 reserve命令是由消费者发起的命令,消费者通过该命令来获取tube中的job。消费者也可以为该命令设置超时时间。实现原理分析reserve命令是由消费者端发起的,该指令会从使用的tube的ready堆中取出一个job,返回给消费者。若没有准备好的job,消费者会阻塞,直到有准备好的job为止。 reserv...原创 2018-08-23 19:39:44 · 837 阅读 · 0 评论 -
Beanstalkd源码分析—Put命令的实现
概述本文介绍了put命令的实现原理和并对源码进行了分析。Put命令的实现原理put命令是由生产者执行,该命令把新的任务添加到beanstalkd中。但不添加过期时间或生效延迟时间时,该job的状态是READY。处于该状态的job,消费者可以通过reserve()进行订阅和消费。 put命令的主要实现逻辑如下(这里说的是一般put命令的实现逻辑): (1) 创建一个Job实体,初...原创 2018-08-19 19:03:39 · 611 阅读 · 0 评论 -
Kafka原理分析-持久化方案设计(Persistence)
Kafka持久化方案的设计 Kafka很大程度上依赖文件系统来存储和缓存消息。有一普遍的认识:磁盘很慢。这让人们怀疑使用磁盘作为持久化的性能。实际上,磁盘是快还是慢完全取决于我们是如何使用它。 就目前来说,一个 six 7200rpm SATA RAID-5磁盘线性(顺序)写入的性能能达到600MB/sec,而任意位置写(寻址再写)的性能只有100k/sec。这些线性读写是所有使用模原创 2017-06-13 16:19:20 · 3190 阅读 · 0 评论 -
Kafka设计原理--性能上的设计考虑
概述本文总结了Kafka的一些设计原则和思想。通过本文,可以了解,为什么kafka的读写性能如此之高,在设计时考虑了那些方面。性能上的设计考虑使用批量传输和读写在效率上Kafka做了很大的努力。它考虑的主要场景是:高吞吐写和高并发读。也就是,在大量的写数据和多方读取数据的场景,kafka尽量使得读和写付出的代价最小。那么,它是如何做到的呢?我们知道,大量小数量的网络I/O和服务...原创 2018-07-28 22:19:18 · 302 阅读 · 0 评论 -
Kafka设计原理--生产者和消费者的设计
概述本文说明了Kafka的生产者和消费者的设计原则,通过本文可以了解生产者和消费者的设计原理和思想,为更好的理解Kafka的运行机制打下基础。生产者(Producer)的设计生产则的设计考虑了两个方面:如何实现负载均衡如何提高I/O效率负载均衡生产者(Producer)把数据直接发送到Partition的leader所在的Broker服务器,而不经过任何的路由层。为了...原创 2018-07-30 08:02:54 · 1578 阅读 · 0 评论 -
Kafka设计原理--日志复制,日志压缩,副本管理
概述本文讲述了kafka在其他方面,比如:消息传递语言,数据复制,数据压缩等方面的设计思想。消息传递语义一般来说可以提供多种消息传递的语义保证: (1) 最多一次:消息可能会丢失,但不会重新传递。 (2) 至少一次:消息永远不会丢失,但可能会重新传递。 (3) 保证正确的一次:这是真正想要的,每个消息都传递一次,只有一次。从这些语义来看,这里有两个问题: (1) 保证p...原创 2018-08-03 21:23:37 · 952 阅读 · 0 评论 -
Beanstalk源码分析--系统初始化
概述本文接上文,继续分析和探讨beanstalk的实现原理。本文对beanstalk的启动过程做一个分析,这样可以对其运行框架有一个总体上的把握。 beanstalkd是使用epoll作为事件处理框架,为什么epoll如此高效,可以参考我以前写的一篇对其实现代码分析的文章。源码分析软件入口beanstalkd的初始化流程代码非常简洁。主要完成各种数据结构的初始化,创建服务器监听s...原创 2018-07-31 07:28:04 · 417 阅读 · 0 评论 -
beanstalkd源码分析--事件处理机制
概述本文接着讲述beanstalkd的事件处理机制,这其实也是大多数服务器要实现的步骤。我们且看beanstalkd是如何实现的。源码分析接受客户端连接在主服务函数:void srvserve(Server *s)中初始化时,会把sock.f设置成srvaccept。 该函数主要是用来接受来自客户端的连接请求。voidsrvserve(Server *s){ ...原创 2018-07-31 07:37:04 · 411 阅读 · 0 评论 -
beanstalkd源码分析--命令处理流程
概述本文讲述了beanstalk的命令处理流程。处理客户端连接请求前面已经讲过,当服务启动时会把处理函数设置成srvaccept,用来建立客户端的tcp连接请求。voidsrvserve(Server *s) { ... // 设置处理函数 s->sock.f = (Handle)srvaccept; ... // 进入死循环...原创 2018-08-02 14:12:46 · 296 阅读 · 0 评论 -
Beanstalkd介绍
概述本文介绍了Beanstalkd的功能和状态转换过程。 Philotic公司开发了beanstalkd,以改善Facebook应用程序的响应时间(超过950万用户)。Beanstalkd将最常见页面的平均响应时间缩短到原来的一小部分,从而显着改善了用户体验。 说明:本文使用的beanstalkd客户端是:python语言实现的beanstalkc。基本原理beanstalkd是一...原创 2018-08-19 09:13:25 · 710 阅读 · 0 评论 -
Beanstalkd源码分析—watch命令的实现
概述本文描述了beanstalkd中的watch命令的作用和实现原理。watch命令说明在beanstalkd中,watch命令影响的是reserve操作。我们可以用watch命令来添加一个被监控的tube,通过ingore来取消watch的tube。 watch的tube可以是多个,每watch一个就会添加到watch队列中,只要其中有一个tube有数据,reserve就会返回...原创 2018-08-22 13:09:22 · 650 阅读 · 0 评论 -
Beanstalkd源码分析—bury和kick命令的实现
概述本文分析了beanstalkd的bury命令和kick命令的实现原理。bury和kick指令原理bury和kick是一组相反操作的指令。当我们暂时不想再关注一个job时,可以把它bury掉。这样任何人就无法订阅(reserve)到该job了。直到有人发送了kick指令,此时该job又回到了READY状态,可以被订阅。bury和kick指令的格式bury指令说...原创 2018-08-26 10:26:58 · 761 阅读 · 0 评论 -
kafka原理分析—API层实现总体框架分析
概述本文描述了kafka broker API层的实现原理。API层主要用来处理kafka客户端发送过来的请求,或者把请求发送给对应的处理子系统,并把处理结果返回给客户端。也可以查看这篇文章来了解API层的功能。API层的启动和初始化上图是kafka API层的启动和初始化过程,可以看到,API层是通过一个线程池来实现的,该线程池也可以通过修改server.properties文件中的...原创 2019-01-19 21:50:13 · 412 阅读 · 0 评论