中间件
文章平均质量分 60
有趣的灵魂_不世俗的心
这个作者很懒,什么都没留下…
展开
-
kafka日志存储
首先我们来看下kafka消息的储存情况:Kafka中的Message是以topic为基本单位组织的,不同的topic之间是相互独立的。每个topic又可以分成几个不同的partition(每个topic有几个partition是在创建topic时指定的),每个partition存储一部分Message。借用官方的一张图,可以直观地看到topic和partition的关系。此外我们知道kafka是顺序的读写的。Partition是以文件的形式存储在文件系统当中,例如创建一个topic名为test-to原创 2021-12-24 13:15:09 · 370 阅读 · 0 评论 -
kafka相关命令
topic相关创建topickafka-topics.sh --bootstrap-server ${kafkaAddress} --create --topic ${topicName} --partitions ${partipartions} --replication-factor ${replication}查看topickafka-topics.sh --bootstrap-server ${kafkaAddress} --topic ${topicName} --describe转载 2022-03-16 09:06:03 · 229 阅读 · 0 评论 -
kafka常见问题处理
消费消息超时,导致重复消费问题,消息堆积报错日志示例org.springframework.kafka.KafkaListenerEndpointContainer#2-0-C-1 org.apache.kafka.clients.consumer.internals.ConsumerCoordinator.maybeAutoCommitOffsetsSync:648 - Auto-commit of offsets {gate_contact_modify-0=OffsetAndMetadata{of原创 2022-03-10 16:26:03 · 2945 阅读 · 0 评论 -
Kafka rebalance触发条件
首先我们需要kafka的rebalance的一些概念:版的消费者客户端对此进行了重新设计,将全部消费组分成多个子集,每个消费组的子集在服务端对应一个GroupCoordinator对其进行管理,GroupCoordinator是Kafka服务端中用于管理消费组的组件。而消费者客户端中的ConsumerCoordinator组件负责与GroupCoordinator进行交互。ConsumerCoordinator与GroupCoordinator之间最重要的职责就是负责执行消费者再均衡的操作,包括前面提及原创 2022-03-09 18:12:47 · 2576 阅读 · 0 评论 -
RabbitMQ实现延迟队列
实现方式一:死信队列AMQP协议和RabbitMQ队列本身没有直接支持延迟队列功能,但是可以通过以下特性模拟出延迟队列的功能。但是我们可以通过RabbitMQ的两个特性来曲线实现延迟队列:1、Time To Live(TTL)RabbitMQ可以针对Queue设置x-expires 或者 针对Message设置 x-message-ttl,来控制消息的生存时间,如果超时(两者同时设置以最先到期的时间为准),则消息变为dead letter(死信)RabbitMQ针对队列中的消息过期时间有两种方法可原创 2022-03-08 18:44:03 · 3699 阅读 · 0 评论 -
kafka消息丢失
文章目录消息传递语义消息丢失场景Producer端丢失场景Broker 端丢失场景Consumer 端丢失场景剖析消息丢失解决方案Producer 端消息丢失解决方案Broker 端解决方案Consumer 端解决方案全文概览图消息传递语义1)首先当 Producer 向 Broker 发送数据后,会进行 commit,如果 commit 成功,由于 Replica 副本机制的存在,则意味着消息不会丢失,但是 Producer 发送数据给 Broker 后,遇到网络问题而造成通信中断,那么 Prod原创 2022-02-22 20:50:36 · 1325 阅读 · 2 评论 -
kafka中Broker常用配置
broker.id解释:每个Broker的唯一标识,默认为0 建议采用形式host1.xx.com,host2.xx.comlisteners解释:监听端口,默认9092,如果使用1024以下端口,需要使用root权限启动Kafka。num.network.threads解释:服务器用于接收来自网络的请求并向网络发送响应的线程数 默认值为3num.io.threads解释:服务器用于处理I/O请求(可能包括磁盘I/O)的线程数 默认值8socket.send.buffer.bytes解释原创 2021-12-28 12:33:59 · 947 阅读 · 0 评论 -
kafka集群中zookeeper的作用
1、Broker注册Broker是分布式部署并且相互之间相互独立,但是需要有一个注册系统能够将整个集群中的Broker管理起来,此时就使用到了Zookeeper。在Zookeeper上会有一个专门用来进行Broker服务器列表记录的节点:/brokers/ids每个Broker在启动时,都会到Zookeeper上进行注册,即到/brokers/ids下创建属于自己的节点,如/brokers/ids/[0…N]。Kafka使用了全局唯一的数字来指代每个Broker服务器,不同的Broker必须使用不同原创 2021-12-23 17:45:58 · 960 阅读 · 0 评论 -
Kafka为什么要抛弃ZooKeeper?
首先我们需要明白zookeeper在kafka中作用1、提供元数据的管理(如一些 Broker 的信息、主题数据、分区数据等等。)2、Broker注册、Consumer注册。3、分区中leader副本的选举。4、生产者和消费者的负载均衡。5、维护消费组和消费者之间关系及每个partition的消费信息。抛弃ZooKeeper理由1:维护成本更高Kafka作为中间件,强依赖于另一个中间件,搭建kafk集群,需要先搭建zookeeper集群。增加运维难度。2、CP,强一致性如果 ZooKe原创 2021-12-23 17:41:58 · 1747 阅读 · 0 评论 -
kafka重复消费问题
造成消息重复的原因:根本因素:数据已经消费了,但是offset没有提交。1、 程序被kill或者系统宕机、重启,导致offset没有提交。2、 消费数据后,offset还没有提交时,partition就断开连接。max.poll.interval.ms参数定义了两次poll的最大间隔,它的默认值是 5 分钟,表示你的 Consumer 程序如果在 5 分钟之内无法消费完 poll 方法返回的消息,那么 Consumer 会主动发起“离开组”的请求,Coordinator 也会开启新一轮 Rebalan原创 2021-12-23 12:58:20 · 1557 阅读 · 0 评论 -
kafka消费组和分区关系详解
消费组概念:Consumer Group 是 Kafka 提供的可扩展且有容错性的消费者机制。一个组里面有多个消费者实例,这些消费者共享一个ID,称为Group ID。组内的所有消费者协调在一起来消费订阅主题(Subscribed Topics)的所有分区(Partition)下面通过图来解释分组和分区的关系假设某个主题,共有4各分区P0,P1,P2,P3,有两个消费组,消费组A共4各消费者:A0,A1,A2,A3, 消费组B共有2个分组:B0,B1具体分配图如下1、每个分区只能被一个消费组中的原创 2021-12-16 22:40:48 · 6648 阅读 · 0 评论 -
kafka生产者架构
首先,我们先上图。概念解释:生产者拦截器 ProducerInterceptor拦截器(Interceptor)功能最早在kafka0.10.0.0中引入,kafka一共有两种拦截器:生产者拦截器和消费者拦截器。生产者拦截器可以用来在消息发送前做一些处理,例如按照某个规则过滤不符合要求的消息、修改消息的内容等,也可以用来在发送回调逻辑前做一些定制化的需求,比如统计类工作。要实现自定义拦截器,需要实现ProducerInterceptor接口。序列化(Serializer)...原创 2021-12-13 21:34:06 · 1563 阅读 · 0 评论 -
kafka定义,作用、使用场景和优势
kafka定义Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。kafka的优缺点:优点:1、高吞吐量、低延迟kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒;2、高拓展性:kafka集群支持热扩展;3、持久性、可靠性消息被持久化到本地磁盘,并且支持数据备份防止数据丢失;4、 容错性允许集群中节点故障(若副本数量为n,则允许n-1个节点故障);原创 2021-12-13 16:45:04 · 7979 阅读 · 0 评论 -
kafka为什么这么快
1、分区策略(1) Topic中可存在多个Partition(2) 消息是以日志的方式,记录到每个分区。在磁盘中每个Partition单独一个文件夹用于存储该发送到该分区的消息。(3)程序可以并行将消息写入多个分区文件。2、顺序读写日志文件的读写采用了顺序读取方式,极大的提高读写性能。3、零拷贝技术常规拷贝技术零拷贝技术以两图对比,可以发下零拷贝技术减少了用户缓冲区这个中转过程,直接从分页缓存拷贝到了socket缓冲区,一切都发生在内核空间。,加快了文件的拷贝速度。4、充分利用 Pa原创 2021-12-10 16:28:13 · 1044 阅读 · 0 评论 -
RabbitMQ实现多线程消费
本文实现多线程消费,其实原理就在同一个项目中建立多个@RabbitListener(queues = RabbitMqQueueConfig.FANOUT_EMAIL_QUEUE),多个消费者处理统一队列中的消息其利用RabbitMq中SimpleRabbitListenerContainerFactory建立多个同一队列的监听连接@Configurationpublic class RabbitConsumerConfig { //并发数量 public static final i转载 2021-11-28 17:03:31 · 4516 阅读 · 0 评论 -
用kafka踩过的一些非比寻常的坑
我的上家公司是做餐饮系统的,每天中午和晚上用餐高峰期,系统的并发量不容小觑。为了保险起见,公司规定各部门都要在吃饭的时间轮流值班,防止出现线上问题时能够及时处理。我当时在后厨显示系统团队,该系统属于订单的下游业务。用户点完菜下单后,订单系统会通过发kafka消息给我们系统,系统读取消息后,做业务逻辑处理,持久化订单和菜品数据,然后展示到划菜客户端。这样厨师就知道哪个订单要做哪些菜,有些菜做好了,就可以通过该系统出菜。系统自动通知服务员上菜,如果服务员上完菜,修改菜品上菜状态,用户就知道哪些菜已经上了,哪些转载 2021-11-14 09:55:35 · 234 阅读 · 0 评论 -
Redist过期策略、应用、持久化
Redis的过期淘汰策略Redis的过期策略我们在set key的时候,可以给它设置一个过期时间,比如expire key 60。指定这key60s后过期,60s后,redis是如何处理的嘛?我们先来介绍几种过期策略:定时过期每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即对key进行清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。惰性过期只有当访问一个key时,才会判断该key是否已过期,过期则清除转载 2021-11-09 07:58:00 · 1085 阅读 · 0 评论 -
Kafka如何做到不丢失消息不重复消费
有很多公司因为业务要求必须保证消息不丢失、不重复的到达,比如无人机实时监控系统,当无人机闯入机场区域,我们必须立刻报警,不允许消息丢失。而无人机离开禁飞区域后我们需要将及时报警解除。如果消息重复了呢,我们是否需要复杂的逻辑来自己处理消息重复的情况呢,这种情况恐怕相当复杂而难以处理。但是如果我们能保证消息exactly once,那么一切都容易得多。下面我们来简单了解一下消息传递语义,以及kafka的消息传递机制。首先我们要了解的是message delivery semantic 也就是消息传递语义。转载 2021-10-18 14:58:39 · 1053 阅读 · 0 评论 -
Windows安装RabbitMQ
rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统。它遵循Mozilla Public License开源协议,采用 Erlang 实现的工业级的消息队列(MQ)服务器,Rabbit MQ 是建立在Erlang OTP平台上。1、首先需要安装依赖环境Erlang(1)下载地址:https://www.erlang.org/downloads 尽量选择新版本,Rabbit MQ的新版本需要Erlang的最新版本支持(2)配置环境变量,必须。在path中后面添加erlang安装路原创 2021-10-11 10:44:37 · 73 阅读 · 0 评论 -
window下搭建kafka
1、首先下载zookeeper,下载地址如下:https://www.apache.org/dyn/closer.lua/zookeeper/zookeeper-3.5.9/apache-zookeeper-3.5.9-bin.tar.gz2、下载kafka,下载地址如下:http://kafka.apache.org/downloads.html3、解压zookeeper文件,并更改zookeeper配置文件名称4、添加zookeeper系统环境配置(1)、添加变量ZOOKEEPER_HOM原创 2021-09-22 16:04:49 · 109 阅读 · 0 评论 -
redis实现数据缓存,缓解数据库压力
思路:1、先判断redis是否存在该数据,存在则从redis中获取,不存在则从数据库查询,并保存到redis中,设置期失效时间。 @PostMapping("testRedis") public Object testRedis(String language){ if(redisTemplate.hasKey(IEO_REDIS_ALLINFO)){ St...原创 2019-08-28 15:08:20 · 1485 阅读 · 1 评论 -
SpringBoot整合ActiveMQ
生产者:引入Maven依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <depend...原创 2019-06-04 11:46:43 · 77 阅读 · 0 评论 -
Linux环境下安装Kafaka实战
安装zookeeper首先用java –version查看是否安装了JDK在安装好JDK的前提下在浏览器访问下面网址:http://mirror.bit.edu.cn/apache/zookeeper/找到对应的zookeeper版本。Linux执行1、cd /usr/local2、wget http://mirror.bit.edu.cn/apache/zookeeper...原创 2020-02-11 21:52:37 · 579 阅读 · 0 评论 -
利用redis分布式锁解决高并发问题
SETNX命令简介SETNX key value将key的值设为value,并且仅当key不存在。若给定的key已经存在,则SETNX不做任何操作。SETNX 是SET if Not eXists的简写。返回整数,具体为1,当 key 的值被设置 0,当 key 的值没被设置实现分布式事务的java代码通用方法public Boolean getHadoopLock...原创 2019-08-30 15:55:34 · 964 阅读 · 0 评论 -
Java实现ActiveMQ多种消息模式
找到上图文件启动ActiveMQ程序,如下图所示使用ActiveMQ完成点对点(p2p)通讯模式引入pom文件依赖<dependencies> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-core&l...原创 2019-06-04 11:32:09 · 440 阅读 · 0 评论 -
消息队列MQ技术的介绍和原理
MQ 是message queue ,消息队列,也叫消息中间件,是一种应用程序对应用程序的通信方法,是分布式系统的重要主件。主要用于解决应用解耦、异步消息、流量削锋等问题,实现高可用、可伸缩和最终一致性的架构。目前使用较多的有ActiveMQ、RabbitMQ、Kafka、RocketMQ、ZeroMQ。实现原理:应用程序通过对数据(消息)的写和检索出入列队的方式,来实现应用程序与应用程序...原创 2019-06-04 09:55:38 · 1710 阅读 · 0 评论 -
使用Redis分布式锁处理并发,解决超卖问题
一、使用Apache ab模拟并发压测1、压测工具介绍$ ab -n 100 -c 100 http://www.baidu.com/-n表示发出100个请求,-c模拟100个并发,相当是100个人同时访问。还可以这样写:$ ab -t 60 -c 100 http://www.baidu.com/-t表示60秒,-c是100个并发,会在连续60秒内不停的发出请求。使用...转载 2019-08-28 16:59:30 · 273 阅读 · 0 评论 -
redis实现读写分离和哨兵机制
如果想要在本地模拟的话,需要克隆三台安装好Redis的虚拟机。首先我们需要找到redis.conf,sentinel.conf两个文件,他们分别是redis的主要配置文件,和哨兵机制的配置文件一般都在redis安装包解压后的文件夹目录下:接下来我们开始进入读写分离:所谓的读写分离,其实是说主服务器实现读写操作权限,从服务器实现读操作。执行流程如下:1、当从Redis启动时,会给主Redis发送一个同步数据请求(sync命令)2、当主redis接收到sync命令后,会将数据快照起来原创 2020-05-13 22:44:37 · 1463 阅读 · 0 评论 -
Redis中String数据结构实战应用场景简介
String数据结构的应用场景解析字符串常用操作:SET key value //存入字符串键值对MSET key value [key value ............] //批量存储字符串键值对SETNX key value ...原创 2019-11-26 17:26:50 · 178 阅读 · 0 评论 -
Redis中Hash数据结构实战应用场景简介
Hash常用的操作HSET key field value //存储一个哈希表key的键值HSETNX key field value //存储一个不存在的哈希表key的键值HMSET key field value [key filed value] //在一个哈希表中存储多个键值对HGET key field ...原创 2019-11-26 17:50:34 · 600 阅读 · 0 评论 -
利用redis生成自增编号
/** * redis key的层级不能超过3层() * 根据前缀+日期+每天的自增编号例如(WF2021041411200001) * * @param prefix * @param key * @param length * @return */ public String getDayIncrCode(String prefix, String key, int length) { Stri...原创 2021-05-28 17:44:05 · 6194 阅读 · 2 评论 -
Redis中List数据结构实战应用场景简介
LPUSH key value [value........] //将一个或者多个value插入到key列表的表头(最左边)RPUSH key value [value........] //将一个或者多个value插入到key列表的表尾(最右边)LPOP key ...原创 2019-11-26 18:47:43 · 476 阅读 · 0 评论 -
kafka多个消费者同时消费topic中的消息
首先我们先模拟生产者代码 /** * 多个消费者同时消费一条消息 */ @GetMapping("/kafka/many_consumer") public void manyConsumer() { for (int i = 0; i <1; i++) { try { Thread.sleep(3); } catch (InterruptedException原创 2021-09-30 14:27:34 · 7797 阅读 · 1 评论