主页

分布式任务队列Celery的实践

笔者在近期工作中有接触到 Celery,这是一个开源的分布式任务队列(Distributed Task Queue),在 Github 上现有 18k star,主要可以用于实现应用中的异步任务和定时任务,虽然是用 Python 编写,但协议可以用任何语言实现,现已有 gocelery、nodecelery 和 celery-php 等。 笔者写下此文总结对 Celery 的了解和在工作中的使用。本文的大概内容如下: 任务队列是什么; Celery 做了什么; Celery 在工作中的实践。 任务队列是什么 “消息队列(Message Queue)”,后端同学应该都有了解,常见的有 RabbitMQ、RocketMQ、Kafka。而“任务队列(Task Queu...

阅读更多

分析事故根本原因的利器——5Why分析法

笔者最近接触到5Why分析法,觉得该方法简单实用,有助于分析问题的原因,因此尝试用来分析今年的一次生产事故。在开始分析前,先对5Why分析法进行介绍。 5Why分析法,是一种分析问题根本原因的方法,由丰田集团创始人丰田佐吉提出,后来成为丰田汽车公司获得成功的重要方法,并且被融入到各种管理方法中。该方法的字面意思是 5 个为什么,指的是对一个问题连续问出 5 个为什么,以分析其根本原因。丰田汽车前副社长大野耐一举过这样一个例子: 问题 1 :为什么机器停了? 答:因为机器超载,保险丝烧断了。— 换保险丝(防堵措施) 问题 2 :为什么机器会超载? 答:因为轴承的润滑不足。— 加润滑剂(改善措施) 问题 3 :为什么轴承会润滑不足? 答:因为润滑泵失灵...

阅读更多

Kafka的10道基础面试题

这次给大家分享的是Kafka的10道面试题,就难度我觉得是比较基础的,但考的知识点还比较全面,可以用来考察自己掌握Kafka基础的程度。 1. Kafka是什么? Kafka起初是一个多分区、多副本且基于ZooKeeper协调的分布式消息系统,现已被定位为一个分布式流式处理平台。 2. Kafka的架构了解吗? 建议按以下顺序讲述: Kafka是基于发布/订阅的消息系统(引出Producer、Consumer和Broker),所以存在三个角色Producer(生产消息)、Broker(Kafka实例)和Consumer(消费消息)。 生产者会将消息推送到Kafka的某个Topic上,以此区分消息。 为了高可用性,通过在集群上部署多个Broker,一个Topic将...

阅读更多

Kafak中改进的二分查找算法

最近有学习些Kafak的源码,想给大家分享下Kafak中改进的二分查找算法。二分查找,是每个程序员都应掌握的基础算法,而Kafka是如何改进二分查找来应用于自己的场景中,这很值得我们了解学习。 由于Kafak把二分查找应用于索引查找的场景中,所以本文会先对Kafka的日志结构和索引进行简单的介绍。在Kafak中,消息以日志的形式保存,每个日志其实就是一个文件夹,且存有多个日志段,一个日志段指的是文件名(起始偏移)相同的消息日志文件和4个索引文件,如下图所示。 在消息日志文件中以追加的方式存储着消息,每条消息都有着唯一的偏移量。在查找消息时,会借助索引文件进行查找。如果根据偏移量来查询,则会借助位移索引文件来定位消息的位置。为了便于讨论索引查询,下文都将基于位移索引这一背景。位移...

阅读更多

使用Map时,需要考虑什么

关于Java中的Map,已有很多文章讲述其较为完整的知识点了,本文不会再谈论这些知识点,而是从实际使用的角度,讲述笔者会考虑什么问题,算是对知识的一个应用,毕竟学了,最后还是要落地到使用中。 首先,在使用Map前,我们先考虑第一个问题,为什么要使用Map这种数据结构。在工作中,笔者会想到使用到Map的场景通常有: 对数据按某种规则分组,用Key做分组的标识; 缓存,用Key做索引查找数据。 在确认要使用Map后,便需要考虑使用哪种Map。通常最先想到,也最常用的是HashMap。但需要注意两个地方,是否对线程安全、有序性有要求。 线程安全: 如果是不存在并发写入,则可以直接使用HashMap。 如果存在并发写入的情况,就需要使用线程安全的Concurre...

阅读更多

一次Maven依赖冲突踩坑,把依赖调解、类加载彻底整明白了

一次Maven依赖冲突采坑,把依赖调解、类加载彻底整明白了 今年年初的时候,阅读过《Maven实战》,当时有了解到Maven可以依赖调解,即当包版本不一致时,会根据一定规则选择相应的包来加载,从而避免冲突。当时不解的是既然Maven都能解决冲突,为何还经常听到“发生了依赖冲突”,冲突不是解决了吗,还存在什么问题呢?直到这周在工作中自己遇到了,就明白是咋回事了。下面先从我的实际经历说起。 1. Maven依赖冲突经历 我在Y模块中,写了一个Encryptor类,主要是使用了DigestUtils、MessageDigest、HmacUtils等类对字符串进行加密(下面代码是随便写的,只表示使用到了这些类),如下: import org.apache.commons.codec.b...

阅读更多

MySQL中的数据类型和schema优化

最近在学习MySQL优化方面的知识。本文就数据类型和schema方面的优化进行介绍。 1. 选择优化的数据类型 MySQL支持的数据类型有很多,而如何选择出正确的数据类型,对于性能是至关重要的。以下几个原则能够帮助确定数据类型: 更小的通常更好 应尽可能使用可以正确存储数据的最小数据类型,够用就好。这样将占用更少的磁盘、内存和缓存,而在处理时也会耗时更少。 简单就好 当两种数据类型都能胜任一个字段的存储工作时,选择简单的那一方,往往是最好的选择。例如整型和字符串,由于整型的操作代价要小于字符,所以当在两者之间选择时,选择整型通常能够获得更好的性能。 尽量避免NULL 当列可为NULL时,对于...

阅读更多

Kafka中副本机制的设计和原理

在《图解Kafka中的基本概念》中已经对副本进行了介绍。我们先回顾下,Kafka中一个分区可以拥有多个副本,副本可分布于多台机器上。而在多个副本中,只会有一个Leader副本与客户端交互,也就是读写数据。其他则作为Follower副本,负责同步Leader的数据,当Leader宕机时,从Follower选举出新的Leader,从而解决分区单点问题。本文将继续深入了解Kafka中副本机制的设计和原理。 好处 副本机制的使用在计算机的世界里是很常见的,比如MySQL、ZooKeeper、CDN等都有使用副本机制。使用副本机制所能带来的好处有以下几种: 提供数据冗余,提高可用性; 提供扩展性,增加读操作吞吐量; 改善数据局部,降低系统延时。 但并不是每个好处都能获...

阅读更多