西维蜀黍

【Distributed System】Data Flow - 消息队列(Message Queue)

消息队列(Message Queue)

Message Queue, Message broker and message-oriented middleware are used interchangeably.

我们可以把消息队列比作是一个存放消息的容器,当我们需要使用消息的时候可以取出消息供自己使用。消息队列是分布式系统中重要的组件,使用消息队列主要是为了通过异步处理提高系统性能和削峰、降低系统耦合性。目前使用较多的消息队列有ActiveMQ,RabbitMQ,Kafka,RocketMQ。

另外,我们知道队列 Queue 是一种先进先出的数据结构,所以消费消息时也是按照顺序来消费的。比如生产者发送消息1,2,3…对于消费者就会按照1,2,3…的顺序来消费。但是偶尔也会出现消息被消费的顺序不对的情况,比如某个消息消费失败又或者一个 queue 多个consumer 也会导致消息被消费的顺序不对,我们一定要保证消息被消费的顺序正确。

除了上面说的消息消费顺序的问题,使用消息队列,我们还要考虑如何保证消息不被重复消费?如何保证消息的可靠性传输(如何处理消息丢失的问题)?等等问题。所以说使用消息队列也不是十全十美的,使用它也会让系统可用性降低、复杂度提高,另外需要我们保障一致性等问题。

  ...


【Distributed System】Dubbo 入门

Dubbo

  • 服务,就是远程server启动一个服务,来处理client的调用。
  • 调用服务,顾名思义,一般使用rpc,简单方便,通过代理调用,跟调用普通对象方法一样。
  • 协议,client调用服务,实际上就是client与server之间的一次通讯,协议就是定义通讯的标准,以便双方可以正常的发送/接受/组织/识别数据数据等,包含如传输的子协议,序列化的技术等等。
  • 服务识别,就是说client要知道服务在台机器上,这样client才能调用服务。单机服务直接写死一个ip+port就行了,但是分布式服务,还需要支持动态扩容的话,就得需要一种机制来时刻给client通知最新的服务分布在哪些机器上。一般使用单独注册中心来管理与通知这些服务分布情况。
  • 均衡负载,就是说服务一般由多个server来提供,要将请求均摊到各个server中,一般是在client端实现的,是结合2调用服务 + 4服务识别来实现的。
  • 总结:最简单的理解就是 dubbo = rpc + 注册中心
  ...


【Java】值传递(Pass by Value)与引用传递(Pass by Reference)

实际参数与形式参数

我们都知道,在Java中定义方法的时候是可以定义参数的。比如Java中的main方法:

public static void main(String[] args)

这里面的args就是参数。参数在程序语言中分为形式参数(formal parameter)和实际参数(Actual Parameter)。

  • 形式参数:是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数。
  • 实际参数:调用方法时传入的真实值或变量
  ...


【Linux】统计某文件/文件夹个数

统计某文件夹下文件的个数

$ ls -l |grep "^-"|wc -l
  ...


【Database】数据库连接池(Connection Pool)

数据库连接池(Database Connection Pool)

所谓的数据库连接池(Database Connection Pool),就是用来分配,管理,释放数据库连接的。

你也许会问,好像我直接用JDBC也能够实现这些功能吧。嗯,你说的没错,JDBC确实也可以,但是,你记不记得,我们使用JDBC技术的时候,每次用完了,是不是都会将连接关闭;等到下一次再用的时候,是不是都得将数据库连接再打开?

实际上,数据库链接资源是十分宝贵的,我们在小型的项目中还看不出来,在高并发的项目中,你会发现,这样频繁的打开和关闭数据库链接是对服务器的一种摧残,十分影响效率。

  ...


【Operating System】I/O - 磁盘I/O相关概念

磁盘构造

硬盘中一般会有多个盘片(platter)组成,每个盘片包含两个面,每个盘面都对应地有一个读/写磁头(head)。受到硬盘整体体积和生产成本的限制,盘片数量都受到限制,一般都在5片以内。盘片的编号自下向上从0开始,如最下边的盘片的两个盘面分别编号为0面和1面,再上一个盘片的两个盘面就分别编号为2面和3面。

  ...


【Cache System】缓存穿透(Cache Penetration)、缓存雪崩(Cache Avalanche)与缓存击穿(Cache Breakdown)

缓存穿透(Cache Penetration)问题

缓存穿透是指查询一个根本不存在的数据,缓存层和存储层(不一定是DB,可以是任何数据源,比如API)都不会命中,但是出于容错的考虑,如果从存储层查不到数据则不写入缓存层,如下图所示整个过程分为如下 3 步:

  1. 缓存层不命中
  2. 存储层不命中,所以不将空结果写回缓存
  3. 返回空结果
  ...


【Algorithm】海量数据处理 - 布隆过滤器(Bloom Filter)

判断一个元素是否存在一个集合中

先来看几个比较常见的例子

  • 字处理软件中,需要检查一个英语单词是否拼写正确
  • 在 FBI,一个嫌疑人的名字是否已经在嫌疑名单上
  • 在网络爬虫里,一个网址是否被访问过
  • yahoo, gmail等邮箱垃圾邮件过滤功能

这几个例子有一个共同的特点: 如何判断一个元素是否存在一个集合中?

常规思路:

  • 数组
  • 链表
  • 树、平衡二叉树、Trie
  • HashMap (红黑树):通过将值映射到 HashMap 中,就可以在 O(1) 的时间复杂度内返回结果(判断这个元素是否在集合中),效率奇高。但是 HashMap 的实现也有缺点,例如存储容量占比高,考虑到负载因子的存在,通常空间是不能被用满的,而一旦你的值很多例如上亿的时候,那 HashMap 占据的内存大小就变得很可观了。
  • 哈希表

虽然上面描述的这几种数据结构配合常见的排序、二分搜索可以快速高效的处理绝大部分判断元素是否存在集合中的需求。

但是当集合里面的元素数量足够大,如果有500万条记录甚至1亿条记录呢?这个时候常规的数据结构的问题就凸显出来了。

数组、链表、树等数据结构会存储元素的内容,一旦数据量过大,消耗的内存也会呈现线性增长,最终达到瓶颈。

有的同学可能会问,哈希表不是效率很高吗?查询效率可以达到O(1)。但是哈希表需要消耗的内存依然很高。使用哈希表存储一亿个垃圾 email 地址的消耗?

哈希表的做法:首先,哈希函数将一个email地址映射成8字节信息指纹;考虑到哈希表存储效率通常小于50%(哈希冲突);因此消耗的内存:8 * 2 * 1亿 字节 = 1.6G 内存,普通计算机是无法提供如此大的内存。这个时候,布隆过滤器(Bloom Filter)就应运而生。在继续介绍布隆过滤器的原理时,先讲解下关于哈希函数的预备知识。

什么是 Bloom Filter

Bloom Filter,被译作称布隆过滤器,是一种空间效率很高的概率型数据结构(probabilistic data structure),特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在于特定集合中”。

Bloom filter 可以看做是对 bit-map 的扩展,它的原理是:

当一个元素被加入集合时,通过 K 个 Hash 函数将这个元素映射成一个位阵列(Bit array) 中的 K 个点,且把这些点的值置为 1。

当需要判断这个元素是否存在在集合时,将这个元素分别再放到这 K 个 Hash 函数中,我们只要看看此时分别映射到的这 K 个点是不是都是 1,就(大约) 知道这个元素是否存在于集合中了:

  • 如果这些点有任何一个点的值为 0,则被检索元素一定不在于集合中;
  • 如果所有这些点的值都是 1,则被检索元素很可能存在于集合中。

但 Bloom Filter 的这种高效是有一定代价的:在判断一个元素是否属于某个集合时,有可能会把不属于这个集合的元素误认为属于这个集合(false positive)。因此,Bloom Filter 不适合那些“零 错误”的应用场合。而在能容忍低错误率的应用场合下,Bloom Filter 通过极少的错误换取了存储空间的极大节省。

  ...


【Algorithm】海量数据处理 - 位图(Bitmap)

Bitmap

所谓的 Bit-map 就是用一个 bit 位来标记某个元素对应的 Value, 而 Key 即是该元素。由于采用了 Bit 为单位来存储数据,因此在存储空间方面,可以大大节省。

  ...


【Algorithm】海量数据处理 - MapReduce

MapReduce

MapReduce 是一种计算模型,简单的说就是将大批量的工作(数据)分解(MAP)执行,然后再将结果合并成最终结果(REDUCE)。这样做的好处是可以在任务被分解后,可以通过大量机器进行并行计算,减少整个操作的时间。说白了,Mapreduce 的原理就是一个归并排序。

适用范围:数据量大,但是数据种类小可以放入内存。

基本原理及要点:将数据交给不同的机器去处理,数据划分,结果归约。

  ...