中间件
文章平均质量分 89
消息队列 ,数据库中间件等
、楽.
放弃很容易,但坚持一定很酷!
展开
-
Zookeeper的架构设计及原理分析
1. Zookeeper 设计猜想Zookeeper 作为一个分布式协调组件,很多应用系统都会依赖Zookeeper来实现相关业务的处理。前面我们一直在提到,在分布式架构中任何节点都不能以单点状态存在,所以Zookeeper首先需要解决的是单点故障问题,而常见的解决方案就是做主从集群,这个在前面的很多组件讲解中都有提到。那么这个集群需要满足那些功能呢?集群中要有主节点和从节点(也就是集群要有角色)。集群要能做到数据同步,当主节点出现故障时,从节点能够顶替主节点继续工作,但是继续工作的前提是原创 2022-03-15 23:26:49 · 5095 阅读 · 14 评论 -
基于Curator(zookeeper)实现leader选举
在分布式计算中,leader election是很重要的一个功能,这个选举过程是这样子的:指派一个进程作为组织者,将任务分发给各节点。在任务开始前,哪个节点都不知道谁是leader或者coordinator。当选举算法开始执行后,每个节点最终会得到一个唯一的节点作为任务leader。除此之外,选举还经常会发生在leader意外宕机的情况下,新的leader要被选举出来,如下图所示,这个就是所谓的leader选举,而zookeeper作为leader选举的功能,在很多中间件中都有使用,比如kafka基于zoo原创 2022-03-13 23:29:04 · 3700 阅读 · 8 评论 -
zookeeper应用实战之分布式锁
1. 什么是分布式锁?我们先来看这样一个场景,如下图所示,两个用户同时去抢购秒杀商品,当秒杀服务同时收到秒杀请求时,都去进行库存扣减,此时在没有做任何处理的情况下,就会导致库存数量变成负数从而导致超卖现象。这种情况下如果是单体项目,我们一般会选择加锁的方式来避免并发的问题。但是在分布式场景中,采用传统的锁并不能解决跨进程并发的问题,所以需要引入一个分布式锁,来解决多个节点之间的访问控制。2. Zookeeper如何实现分布式锁实现分布式的方式有很多种,本文主要讲述如何使用zookeeper实现分布原创 2022-03-09 22:47:47 · 8917 阅读 · 4 评论 -
Java Api 如何操作 zookeeper (Curator客户端)
本文我们使用的客户端是目前比较成熟的Curator,他是基于zookeeper Api 的封装。1. 依赖使用Curator操作zookeeper,我们首先需要引入相关依赖:framework 是他的核心框架recipes 是基于zookeeper特性封装的一些方法,比如分布式锁、leader选举等。<dependencies> <dependency> <groupId>org.apache.curator</groupId&原创 2022-01-25 16:44:52 · 2369 阅读 · 1 评论 -
zookeeper 权限控制及watch监听机制使用
本文主要记录ZK中的相关特性,包括监听机制、权限控制等。1. ZK特性1.1 节点状态信息stat节点除了存储数据内容以外,还存储了数据节点本身的一些状态信息,通过get命令可以获得状态信息的详细内容,如下所示。状态属性说明cZxid数据节点创建时的事务IDctime数据节点创建时的时间mZxid数据节点最后一次更新时的事务IDmtime数据节点最后一次更新时的时间pZxid数据节点的子节点列表最后一次被修改(是子节点列表变更,而不是子节点内容变原创 2022-01-21 16:31:36 · 3155 阅读 · 0 评论 -
Sharding JDBC 实战 —— 分布式事务处理
在我们使用Sharding JDBC分库分表的时候,会带来另外一个问题,就是分布式事务问题,如下图所示。用户采购商品业务,整个业务包含3个微服务:库存服务: 扣减给定商品的库存数量。订单服务: 根据采购请求生成订单。账户服务: 用户账户金额扣减。这三个业务操作应该属于同一个事务,但是这些数据却分配在不同的数据库上,所以没办法采用数据库的事务来保证数据一致性。这个时候,要解决分布式事务问题,就需要引入全局事务。1. 什么是全局事务呢?全局事务是一个DTP模型的事务,所谓DTP模原创 2022-01-07 21:48:35 · 6093 阅读 · 1 评论 -
Sharding JDBC 实现读写分离架构
在大部分应用中,基本上都是读多写少,也就是从数据库加载数据的场景要比往数据库中添加或者修改数据的场景多,如果我们把所有对数据库的读/写请求都访问到同一个数据库中时,对数据库必然会造成较大的压力,同时也会影响到业务系统的性能,这部分性能影响主要体现在:请求量过大对数据库服务器的压力较大,数据库服务器无法支撑;频繁的共享锁或排他锁的竞争,对性能产生影响;所以为了优化读多写少场景下的性能, 我们可以把读和写进行分离,从而提升读和写的整体性能。而为了达到读写分离的目的,在数据库层面必然需要把一个原创 2022-01-07 13:59:35 · 1024 阅读 · 1 评论 -
Sharding JDBC 快速入门及简单使用(分片算法、SPI机制、执行流程)
1. Sharding-SphereSharding-JDBC 最早是当当网内部使用的一款分库分表框架,到2017年的时候才开始对外开源,这几年在大量社区贡献者的不断迭代下,功能也逐渐完善,现已更名为 ShardingSphere ,2020年4⽉16⽇正式成为 Apache 软件基⾦会的顶级项⽬。随着版本的不断更迭 ShardingSphere 的核心功能也变得多元化起来。如下图,ShardingSphere生态包含三款开源分布式数据库中间件解决方案,Sharding-JDBC、Sharding-Pr原创 2022-01-06 13:46:41 · 3900 阅读 · 0 评论 -
Sharding JDBC 实战 —— 使用相关 API 实现分库分表
本文主要演示Sharding JDBC 相关JAVA API 是如何使用的,通过实际案例让大家能掌握如何分库分表。官网:https://shardingsphere.apache.org/index_zh.html1. 项目搭建通过IDEA直接创建一个Spring Boot 或者 Mavne 项目即可。2. 相关依赖引入相关依赖,如:连接池依赖、数据库依赖以及最重要的shardingsphere-jdbc依赖。<dependencies> <dependency&g原创 2022-01-05 14:02:21 · 1322 阅读 · 0 评论 -
zookeeper 安装部署与简单使用
官网:https://www.apache.org/dyn/closer.cgi/zookeeper/ZooKeeper 是 Apache 的一个顶级项目,为分布式应用提供高效、高可用的分布式协调服务,提供了诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知和分布式锁等分布式基础服务。由于 ZooKeeper 便捷的使用方式、卓越的性能和良好的稳定性,被广泛地应用于诸如 Hadoop、HBase、Kafka 和 Dubbo 等大型分布式系统中。Zookeeper 有三种运行模式:单机模式、伪.原创 2022-01-04 13:02:25 · 1509 阅读 · 1 评论 -
Apollo原理分析及功能详解(配置管理、集群管理等)
官方文档:https://www.apolloconfig.com/#/zh/README1. Apollo工作原理下图是Apollo架构模块的概览:1.1 各模块职责上图简要描述了Apollo的总体设计,我们可以从下往上看:Config Service提供配置的读取、推送等功能,服务对象是Apollo客户端Admin Service提供配置的修改、发布等功能,服务对象是Apollo Portal(管理界面)Eureka提供服务注册和发现,为了简单起见,目前Eureka在部署.原创 2022-01-01 16:33:52 · 6406 阅读 · 1 评论 -
Apollo快速入门(安装及简单使用)
目前市面上用的比较多的配置中心有:(按开源时间排序)Disconf2014年7月百度开源的配置管理中心,专注于各种「分布式系统配置管理」的「通用组件」和「通用平台」, 提供统一的「配置管理服务」。目前已经不再维护更新。https://github.com/knightliao/disconfSpring Cloud Confifig2014年9月开源,Spring Cloud 生态组件,可以和Spring Cloud体系无缝整合。https://github.com/spring-clo原创 2022-01-01 15:08:53 · 1743 阅读 · 0 评论 -
RocketMQ原理详解——生产者、Broker、消费者及高可用架构
1. 生产者前面我们说Message Queue是用来做横向扩展,生产者利用队列可以实现消息的负载和平均分布。那什么时候会发到那个队列呢?1.1 消息发送规则从Producer的send方法开始追踪,在DefaultMQProducer的select方法会选择要发送的Queue:public MessageQueue selectOneMessageQueue(TopicPublishInfo tpInfo, String lastBrokerName) { return this.mqFa原创 2021-12-18 00:07:51 · 3631 阅读 · 0 评论 -
MQ消息队列选型分析
对比项RabbitMQKafkaRocketMQ基本情况所属公司/组织PivotalApacheApache开发语言ErlangScala、JavaJava默认端口5672909210911使用多语言支持十几种十几种4种API完善完善非常完善与 Spring 集成支持支持支持运维管理控制台自带管理界面无自带管理界面权限管理、安全机制Vhost和UserSSL、SASLTLS...原创 2021-12-16 22:38:28 · 320 阅读 · 0 评论 -
RocketMQ 轻松入门
1. 文档汇总源码地址:https://github.com/apache/rocketmq中文文档:https://github.com/apache/rocketmq/tree/master/docs/cn商业版:https://www.aliyun.com/product/rocketmq官网翻译:http://www.itmuch.com/books/rocketmq/FAQ:http://rocketmq.apache.org/docs/faq/RocketMQ常用管理命令:https原创 2021-12-16 21:12:03 · 1766 阅读 · 0 评论 -
RocketMQ安装详解(CentOS/Windows)
1. 下载官方地址:http://rocketmq.apache.org/2. Windows 下安装解压文件夹配置环境变量变量名:ROCKETMQ_HOME变量值:MQ解压路径\MQ文件夹名eg、ROCKETMQ_HOME=D:\dev\rocketmq-all-4.3.0-bin-release修改bin目录下的runbroker.cmd和 runserver.cmd文件比如把8g 4g 改成512m, 4g 2g改成256m如果启动报错找不到启动类,把红框中的内容复制原创 2021-12-15 22:35:07 · 1124 阅读 · 0 评论 -
Kafka原理详解(生产者、消费者、Broker、消息不丢失配置)
1. 生产者原理这里分析的是Apache官方客户端代码,源码位于:https://github.com/apache/kafka/tree/trunk/clients从git clone 后 需要手动切换到对应分支。1.1 生产者消费发送流程消息发送的整体流程如下:生产者主要由两个线程协调运行。这两条线程分别为main线程和sender线程(发送线程)我们可以看源码跟踪一下:从Producer 入口进入即可。 Producer<String, String> producer原创 2021-12-15 14:11:18 · 2832 阅读 · 1 评论 -
Nginx + Lua + Kafka 实现数据日志收集
1. 流程分析用户访问某些界面频率越高,那么此时可以推断当前商品是热门商品,所以我们可以收集商品详情页访问日志,收集方式如上图:1:用户访问界面会经过Nginx2:此时使用log_by_lua收集日志3:log_by_lua将日志发送到Kafka2. 相关安装Nginx安装Kafka安装3. 相关界面发布我们可以将我们需要查看的界面上传服务器,在nginx中配置好相关路径。配置在serve下。 #静态资源 location ~ .*\.(woff|ico|css|原创 2021-12-14 13:18:45 · 4320 阅读 · 1 评论 -
Kafka架构分析
1. Kafka 简介Kafka 是一种分布式的,基于发布 / 订阅的消息系统。主要设计目标如下:以时间复杂度为 O(1) 的方式提供消息持久化能力,即使对 TB 级以上数据也能保证常数时间复杂度的访问性能。高吞吐率。即使在非常廉价的商用机器上也能做到单机支持每秒 100K 条以上消息的传输。支持 Kafka Server 间的消息分区,及分布式消费,同时保证每个 Partition 内的消息顺序传输。同时支持离线数据处理和实时数据处理。Scale out:支持在线水平扩展。2. 架构分析原创 2021-12-12 22:33:43 · 2249 阅读 · 0 评论 -
Kafka常用命令(2.6版本)
1. 脚本概览bin目录下的脚本作用:脚本作用connect-distributed.sh用于启动多节点的Distributed模式的Kafka Connect组件connect-standalone.sh用于启动单节点的Standalone模式的Kafka Connect组件kafka-acls.sh用于设置Kafka权限,比如设置哪些用户可以访问Kafka的哪些TOPIC的权限kafka-broker-api-versions.sh主要用于验证不同Kaf原创 2021-12-12 21:20:58 · 242 阅读 · 0 评论 -
Kafka 安装详解
注意:确保有JDK1.8版本及以上官方文档:https://kafka.apache.org/quickstart清华镜像下载:https://mirrors.tuna.tsinghua.edu.cn/apache/kafka/首先下载安装包,在linux及Windows都可以使用。1. Centos 安装部署1.1 下载将下载好的安装包上传至服务器解压tar -zxvf kafka_2.12-2.6.3.tgz1.2 启动zookeeper后台启动zookeepe.原创 2021-12-12 20:53:56 · 4841 阅读 · 1 评论 -
CentOS7安装RabbitMQ单机版
CentOS版环境由于rabbitMQ是基于erlang环境,所以我们在使用rabbitMQ之前,首先需要配置erlang环境。在配置环境前我们需要去官网查看rabbitMQ与erlang的版本对应关系,如果版本不对应则会安装失败。https://www.rabbitmq.com/which-erlang.html安装下载erlang ## 指定下载位置wget -P /usr/rabbitmq https://github.com/rabbitmq/erlang-rp..原创 2021-09-20 20:46:03 · 296 阅读 · 0 评论 -
RabbitMQ如何实现延迟队列?
1. 业务场景超过30分钟未付款的订单自动关闭,这个功能该如何实现?思路:发一条跟订单相关的消息,30分钟以后被消费,在消费者的代码中查询订单数据,如果支付状态是未付款,就关闭订单。问题来了,怎么实现在指定的时候之后消息才会发给消费者呢?RabbitMQ本事不支持延迟投递,但是可以借助其他方法,总的来说有两种实现方案。先存储到数据库,然后用定时任务扫描利用RabbitMQ的死信队列实现定时任务比较容易实现,比如每隔一分钟扫描一次,查出30分钟之前未付款的订单,把状态改为关闭。但是如果瞬间要原创 2021-12-03 12:58:30 · 420 阅读 · 0 评论 -
轻松实现 RabbitMQ 集群搭建
本文是基于linux系统实现rabbitmq集群搭建。默认已经安装完成,如果未安装,可以到RabbitMQ简单安装查看如何安装。检查是否处于运行状态确保rabbitmq是正常运行的。 ps aux|grep rabbitmq或者systemctl status rabbitmq-server^关闭服务systemctl stop rabbitmq-server单机多实例搭建场景:假设有两个节点,分别为rabbit-1和rabbit-2。rabbit-1作为主节点,rabbit-2原创 2021-10-12 09:33:01 · 148 阅读 · 0 评论 -
RabbitMQ高级技巧——过期时间、死信队列
过期时间在我们业务开发中有这样一个场景,如果一个订单30分钟未支付则移除该订单。这个场景就可以使用到消息队列中的过期时间来处理。过期时间TTL表示可以对消息设置预期的时间,在这个时间内都可以被消费者接受获取;过了之后消息将自动被删除。RabbitMQ可以对消息和队列设置TTL,目前有两种方式可以设置:** 第一种方法是通过队列属性设置,队列中所有消息都有相同的过期时间。**简单使用首先创建工程,然后添加相关依赖即可。编写RabbitMQ配置文件@Configurationpublic原创 2021-10-11 15:37:15 · 749 阅读 · 0 评论 -
RabbitMQ项目实战——商户管理系统
项目介绍商户管理系统:用于管理与公司合作的商户信息,包括商户准入和审核的全流程。有很多下游业务系统需要用到商户信息,每一个系统都会在自己的数据库中存放商户的关键信息。比如提单系统提单需要商户的名称;放宽系统放款需要商户的账号名;风控系统也要关注商信息的变动。这种同步数据的场景,之前一直使用定时同步,也就是依赖一个核心的数据库,我们只需要修改核心数据的商户信息,其他系统定时去核心系统中拉取数据。但是定时同步有两个缺点:首先实时性不高,因为定时任务不可能每分每秒都在运行;其次就是一旦核心数据库出现问题,原创 2021-12-09 16:28:16 · 1475 阅读 · 0 评论 -
RabbitMQ高级——分布式事务
简述分布式事务指事务的操作位于不同的节点上,需要保证事务的ACID特性。例如在下单场景下,库存和订单如果不在同一个节点上就会设计到分布式事务处理。案例我们可以手动模拟一个下单操作,用户下单之后开始派送。通过以下工程演示分布式事务问题。当我们创建完两个项目之后,可以先将派送工程中的模拟错误去除,然后运行派送工程。在订单服务中创建测试类,当程序运行之后,我们可以发现两个数据库中都会新增相应的数据,这就代表我们的流程走通了。但是当我们在派送工程中模拟错误,使订单服务调用派送服务失败的时候,我们可以原创 2021-10-12 18:05:02 · 899 阅读 · 1 评论 -
RabbitMQ 轻松入门看我就够了~
什么是消息队列“消息队列(Message Queue)”是在消息的传输过程中保存消息的容器。在消息队列中,通常有生产者和消费者两个角色。生产者只负责发送数据到消息队列,谁从消息队列中取出数据处理,他不管。消费者只负责从消息队列中取出数据处理,他不管这是谁发送的数据。RabbitMQ的特点RabbitMQ是一款使用Erlang语言开发的,实现AMQP(高级消息队列协议)的开源消息中间件。首先要知道一些RabbitMQ的特点,官网可查:可靠性。支持持久化,传输确认,发布确认等保证了MQ的可靠性。灵活原创 2021-10-09 22:41:34 · 168 阅读 · 0 评论 -
RabbitMQ消息可靠性投递详解
在使用MQ实现异步通信的过程中,有消息丢了怎么办?或者MQ消息重复了怎么办?1. 可靠性投递分析这个问题就需要来到本文的主题——RabbitMQ的可靠性投递。当然,RabbitMQ在设计的时候就考虑了这一点,提供 了很多保证消息可靠投递的机制。这个可以说是RabbitMQ比较突出的一个特性。下面从RabbitMQ的工作模型分析一下可靠性措施。在我们使用RabbitMQ发送消息的时候,有几个主要环节:①代表消息从生产者发送到Broker生产者把消息发到Broker之后,怎么知道自己的消息.原创 2021-12-09 21:41:07 · 2632 阅读 · 1 评论 -
Docker 安装 Rocket MQ
1. 整体架构在安装RocketMQ之前,我们先了解一下RocketMQ的部署架构,了解一下RocketMQ的组件,然后基于当前主流的Docker安装RocketMQ,我们这里安装单台RocketMQ,但为了防止单节点故障、保障高可用,生产环境建议安装RocketMQ集群。 1:NameServer是一个非常简单的Topic路由注册中心,其角色类似Dubbo中的zookeeper,支持Broker的 动态注册与发现。 2:Broker主要负责消息的存储、投递和查询以及服务高可用保证。 3:P原创 2021-12-11 14:06:13 · 6850 阅读 · 4 评论 -
Canal详解
canal,译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据的订阅和消费。学习地址:https://github.com/alibaba/canal早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同步的业务需求,实现方式主要是基于业务trigger 获取增量变更。从 2010 年开始,业务逐步尝试数据库日志解析获取增量变更进行同步,由此衍生出了大量的数据库增量订阅和消费业务。基于日志增量订阅和消费的业务包括:数据库镜像数据库实时备份索引构建和实原创 2021-12-02 12:24:46 · 1783 阅读 · 0 评论