西维蜀黍

【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技术的时候,每次用完了,是不是都会将连接关闭;等到下一次再用的时候,是不是都得将数据库连接再打开?

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

  ...