Zhewen Cao

AMQP

AMQP

消息队列的历史 了解一件事情的来龙去脉,将不会对它感到神秘。让我们来看看消息队列(Message Queue)这项技术的发展历史。 Message Queue的需求由来已久,80年代最早在金融交易中,高盛等公司采用Teknekron公司的产品,当时的Message queue软件叫做:the information bus(TIB)。 TIB被电信和通讯公司采用,路透社收购了Teknekron公司。之后,IBM开发了MQSeries,微软开发了Microsoft Message Queue(MSMQ)。这些商业MQ供应商的问题是厂商锁定,价格高昂。2001年,Java Message queuing试图解决锁定和交互性的问题,但对应用来说反而更加麻烦了。 于是2004年,摩根大通和iMatrix开始着手Advanced Message Queuing Protocol (AMQP)开放标准的开发。2006年,AMQP规范发布。2007年,Rabbit技术公司基于AMQP标准开发的RabbitMQ 1.0 发布。 目前RabbitMQ的最新版本为3.5.7

By Zhewen Cao
Rabbit MQ 介绍

Rabbit MQ 介绍

* RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,起初源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗.RabbitMQ主要是为了实现系统之间的双向解耦而实现的.当生产者大量生产数据时,消费者无法快速消费,就需要一个中间层,保存这个数据. * AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计.消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然.AMQP的主要特征是面向消息、队列、路由(包括点对点&发布/订阅)、可靠性、安全. * RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX.用于在分布式系统中存储转发消息,在易用性、扩展性、

By Zhewen Cao
Redis做缓存层常见问题

Redis做缓存层常见问题

在使用Redis等缓存系统时,会遇到几种常见的缓存问题,包括缓存穿透、缓存击穿和缓存雪崩。这些问题如果处理不当,可能会对系统性能和稳定性造成严重影响。下面是对这三种问题的详细解释和应对策略。 1. 缓存穿透 定义:缓存穿透是指用户查询的数据在缓存中和数据库中都不存在,导致用户每次查询时都要访问数据库,而数据库中没有这些数据,所以每次查询都返回空。如果这类查询很多,就会给数据库带来很大的压力,甚至可能压垮数据库。 应对策略: * 布隆过滤器:在缓存之前加一个布隆过滤器,对所有可能查询的参数以hash形式存储,如果用户查询的数据不存在于布隆过滤器中,则直接返回,不进行后续数据库查询。但注意,布隆过滤器存在误判率。 * 数据库空值缓存:当数据库查询结果为空时,也将这个空结果进行缓存,但设置较短的过期时间。 * 接口层增加校验:在API层面,对输入进行严格的校验,拒绝无效的查询请求。 2. 缓存击穿 定义:缓存击穿是指缓存中某个热点数据(通常是被高并发访问的数据)在某个时间点突然到期了,而在这个时间点刚好有大量并发请求访问这个数据,导致这些请求直接穿透缓存,全

By Zhewen Cao
传统服务器模型与Reactor服务器模型

传统服务器模型与Reactor服务器模型

传统服务器模型与Reactor模型在网络编程和高并发处理中存在显著差异。以下是两者在多个方面的详细对比: 传统服务器模型 定义 传统服务器模型通常指的是基于阻塞IO的服务器实现方式。在这种模型中,服务器会为每个客户端连接分配一个独立的线程或进程,这些线程或进程在IO操作(如读写)未完成时会处于阻塞状态,等待IO操作的完成。 特点 阻塞性:线程或进程在IO操作未完成时会阻塞,无法执行其他任务。 资源消耗:随着客户端连接数的增加,需要创建大量的线程或进程,导致资源消耗增加。 上下文切换:由于大量线程或进程被阻塞和唤醒,系统需要频繁进行上下文切换,增加系统开销。 应用场景 传统服务器模型适用于并发量较小、对性能要求不高的场景。在并发量较大的情况下,其性能会显著下降。 Reactor模型 定义 Reactor模型是一种基于事件驱动和IO多路复用的网络编程模型。它通过单个或多个线程来监听多个客户端连接,并利用IO多路复用技术来同时处理多个连接上的IO事件。 优点 非阻塞性:通过IO多路复用技术,Reactor模型可以在单个线程内同时处理多

By Zhewen Cao
MySQL 的锁

MySQL 的锁

MySQL中的锁是数据库管理系统用来管理对数据库资源的并发访问的一种机制。MySQL中的锁机制主要用于保证数据的一致性、完整性和并发性。在MySQL中,锁可以根据不同的维度进行分类,如锁的粒度、锁的模式以及锁的实现方式等。以下是对MySQL锁机制的详细解析: 一、锁的粒度 MySQL中的锁可以按照粒度分为以下几种: 1. 全局锁:锁定数据库中的所有表,使得整个数据库实例处于只读状态。这种锁主要用于数据备份等场景。 2. 表级锁:锁定整张表,使得其他事务无法对该表进行写操作(在加锁事务提交前)。表级锁的开销较小,但并发度也较低。 3. 行级锁:锁定表中的某一行或几行数据,是MySQL中锁定粒度最小的一种锁。行级锁可以最大程度地支持并发处理,但开销也最大,加锁慢,并可能出现死锁。 二、锁的模式 MySQL中的锁模式主要描述如何请求(申请)锁,常见的锁模式包括: 1. 共享锁(S锁):允许持有该锁的事务读取表中的一行记录,同时允许其他事务在锁定行上加另一个共享锁并读取被锁定的对象,但不能对其进行写操作。 2. 排他锁(X锁):允许持有该锁的事务对数据行进

By Zhewen Cao