- 博客(506)
- 资源 (20)
- 问答 (1)
- 收藏
- 关注
原创 RocketMq-同步复制和异步复制
同步复制和异步复制如果一个Broker组有Master和Slave,消息需要从Master复制到Slave 上,有同步和异步两种复制方式1)同步复制同步复制方式是等Master和Slave均写 成功后才反馈给客户端写成功状态;在同步复制方式下,如果Master出故障,Slave上有全部的备份数据,容易恢复,但是同步复制会增大数据写入延迟,降低系统吞吐量。2)异步复制异步复制方式是只要Master写成功 即可反馈给客户端写成功状态。在异步复制方式下,系统拥有较低的延迟和较高的吞吐量,但是如果Ma
2020-11-18 09:00:54
1803
原创 RocketMQ-消息发送-消费-消息存储
消息发送生产者向消息队列里写入消息,不同的业务场景需要生产者采用不同的写入策略。比如同步发送、异步发送、Oneway发送、延迟发送、发送事务消息等。 默认使用的是DefaultMQProducer类,发送消息要经过五个步骤:1)设置Producer的GroupName。2)设置InstanceName,当一个Jvm需要启动多个Producer的时候,通过设置不同的InstanceName来区分,不设置的话系统使用默认名称“DEFAULT”。3)设置发送失败重试次数,当网络出现异常的时候,这个次数影
2020-11-17 19:41:50
835
原创 RocketMq-单机安装
下载RocketMQ版本:4.5.1https://www.apache.org/dyn/closer.cgi?path=rocketmq/4.5.1/rocketmq-all-4.5.1-bin-release.zipwget https://archive.apache.org/dist/rocketmq/4.5.1/rocketmq-all-4.5.1-bin-release.zip修改脚本 JDK 11要修改bin/runserver.shbin/runbroker.shbin
2020-11-17 14:47:56
115
原创 RocketMq-基本概念
RocketMQ的使用场景应用解耦系统的耦合性越高,容错性就越低。以电商应用为例,用户创建订单后,如果耦合调用库存系统、物流系统、支付系统,任何一个子系统出了故障或者因为升级等原因暂时不可用,都会造成下单操作异常,影响用户使用体验。流量削峰应用系统如果遇到系统请求流量的瞬间猛增,有可能会将系统压垮。有了消息队列可以将大量请求缓存起来,分散到很长一段时间处理,这样可以大大提到系统的稳定性和用户体验。举例:业务系统正常时段的QPS如果是1000,流量最高峰是10000,为了应对流量高峰配置高性能的服务
2020-11-17 11:41:37
167
原创 kafka-ngx_kafka_module
使用Kafka做日志收集。一、需要收集的信息:1、用户ID(user_id)2、时间(act_time)3、操作(action,可以是:点击:click,收藏:job_collect,投简历:cv_send,上传简历:cv_upload)4、对方企业编码(job_code)git clone https://github.com/edenhill/librdkafkacd librdkafka./configuremakesudo make install下载模块git clon
2020-11-16 19:26:19
377
原创 kafka-集群搭建
集群搭建分配三台Linux,用于安装拥有三个节点的Kafka集群。linux141(192.168.181.141)linux142(192.168.181.142)linux144(192.168.181.144)以上三台主机的/etc/hosts配置:192.168.181.141-linux140192.168.181.142-linux141192.168.181.144-linux144安装zookeeper# 解压到/opt目录tar -zxf zookeeper-3.4
2020-11-16 10:43:09
315
原创 kafka-延时队列
延时队列两个follower副本都已经拉取到了leader副本的最新位置,此时又向leader副本发送拉取请求,而leader副本并没有新的消息写入,那么此时leader副本该如何处理呢?可以直接返回空的拉取结果给follower副本,不过在leader副本一直没有新消息写入的情况下,follower副本会一直发送拉取请求,并且总收到空的拉取结果,消耗资源Kafka在处理拉取请求时,会先读取一次日志文件,如果收集不到足够多(fetchMinBytes,由参数fetch.min.bytes配置,默认值为
2020-11-14 17:47:35
2488
1
原创 kafka-集群应用场景
集群应用场景消息传递Kafka可以很好地替代传统邮件代理。消息代理的使用有多种原因(将处理与数据生产者分离,缓冲未处理的消息等)。与大多数邮件系统相比,Kafka具有更好的吞吐量,内置的分区,复制和容错功能,这使其成为大规模邮件处理应用程序的理想解决方案。根据我们的经验,消息传递的使用通常吞吐量较低,但是可能需要较低的端到端延迟,并且通常取决于Kafka提供的强大的持久性保证。在这个领域,Kafka与ActiveMQ或 RabbitMQ等传统消息传递系统相当网站活动路由Kafka最初的用例是能够
2020-11-14 17:06:34
314
原创 kafka-重试队列
重试队列kafka没有重试机制不支持消息重试,也没有死信队列,因此使用kafka做消息队列时,需要自己实现消息重试的功能。实现创建新的kafka主题作为重试队列:创建一个topic作为重试topic,用于接收等待重试的消息。普通topic消费者设置待重试消息的下一个重试topic。从重试topic获取待重试消息储存到redis的zset中,并以下一次消费时间排序定时任务从redis获取到达消费事件的消息,并把消息发送到对应的topic同一个消息重试次数过多则不再重试实现pom.xm
2020-11-14 17:03:50
1149
原创 kafka-__consumer_offsets
__consumer_offsetszookeeper不适合大批量的频繁写入操作。Kafka 1.0.2将consumer的位移信息保存在Kafka内部的topic中,即__consumer_offsets主题,并且默认提供了kafka_consumer_groups.sh脚本供用户查看consumer信息1. 创建topic “tp_test_01 kafka-topics.sh --zookeeper node1:2181/myKafka --create --topic tp_test_01
2020-11-14 15:35:08
1409
原创 kafka-消息重复的场景及解决方案
消息重复和丢失是kafka中很常见的问题,主要发生在以下三个阶段:生产者阶段broke阶段消费者阶段生产者阶段重复场景根本原因生产发送的消息没有收到正确的broke响应,导致生产者重试。生产者发出一条消息,broke落盘以后因为网络等种种原因发送端得到一个发送失败的响应或者网络中断,然后生产者收到一个可恢复的Exception重试消息导致消息重复说明:new KafkaProducer()后创建一个后台线程KafkaThread扫描RecordAccumulator中是否有消息
2020-11-14 15:27:40
1622
转载 kafka-一 致性
一致性保证一、概念水位标记水位或水印(watermark)一词,表示位置信息,即位移(offset)。Kafka源码中使用的名字是高水位,HW(high watermark)。副本角色Kafka分区使用多个副本(replica)提供高可用。LEO和HW每个分区副本对象都有两个重要的属性:LEO和HW。LEO:即日志末端位移(log end offset),记录了该副本日志中下一条消息的位移值。如果LEO=10,那么表示该副本保存了10条消息,位移值范围是[0, 9]。另外,Leader
2020-11-14 14:22:57
189
原创 kafka-稳定性-控制器
控制器afka集群包含若干个broker,broker.id指定broker的编号,编号不要重复。Kafka集群上创建的主题,包含若干个分区。每个分区包含若干个副本,副本因子包括了Follower副本和Leader副本。副本又分为ISR(同步副本分区)和OSR(非同步副本分区)控制器就是一个broker控制器除了一般broker的功能,还负责Leader分区的选举broker选举集群里第一个启动的broker在Zookeeper中创建临时节点 /controller 。其他broker在
2020-11-14 14:05:04
201
原创 kafka-稳定性-事务
稳定性事务一、事务场景如producer发的多条消息组成一个事务这些消息需要对consumer同时可见或者同时不可见 。producer可能会给多个topic,多个partition发消息,这些消息也需要能放在一个事务里面,这就形成了一个典型的分布式事务。kafka的应用场景经常是应用先消费一个topic,然后做处理再发到另一个topic,这个consume-transform-produce过程需要放到一个事务里面,比如在消息处理或者发送的过程中如果失败了,消费偏移量也不能提交。produc
2020-11-14 13:18:01
779
原创 kafka-日志存储
日志存储Kafka 消息是以主题为单位进行归类,各个主题之间是彼此独立的,互不影响。每个主题又可以分为一个或多个分区。每个分区各自存在一个记录消息数据的日志文件创建了一个 tp_demo_01 主题,其存在6个 Parition,对应的每个Parition下存在一个[Topic-Parition] 命名的消息日志文件。在理想情况下,数据流量分摊到各个 Parition 中,实现了负载均衡的效果。在分区日志文件中,你会发现很多类型的文件,比如: index、.timestamp、.log、.sna
2020-11-14 10:38:45
1921
原创 kafka-分区
分区副本机制Kafka在一定数量的服务器上对主题分区进行复制。当集群中的一个broker宕机后系统可以自动故障转移到其他可用的副本上,不会造成数据丢失–replication-factor 3 1leader+2follower将复制因子为1的未复制主题称为复制主题。主题的分区是复制的最小单元。在非故障情况下,Kafka中的每个分区都有一个Leader副本和零个或多个Follower副本。包括Leader副本在内的副本总数构成复制因子。所有读取和写入都由Leader副本负责。通常,分
2020-11-13 19:50:48
446
1
原创 kafka-再均衡
再均衡(Rebalance)本质上是一种协议,规定了一个消费组中所有消费者如何达成一致来分配订阅主题的每个分区。比如某个消费组有20个消费组,订阅了一个具有100个分区的主题。正常情况下,Kafka平均会为每个消费者分配5个分区。这个分配的过程就叫再均衡什么时候再均衡?再均衡的触发条件:组成员发生变更(新消费者加入消费组组、已有消费者主动离开或崩溃了)订阅主题数发生变更。如果正则表达式进行订阅,则新建匹配正则表达式的主题触发再均衡。订阅主题的分区数发生变更如何进行组内分区分配?
2020-11-13 14:29:54
594
原创 Rabbitmq- 延迟队列
延迟队列延迟消息是指的消息发送出去后并不想立即就被消费,而是需要等(指定的)一段时间后才触发消费。例如下面的业务场景:在支付宝上面买电影票,锁定了一个座位后系统默认会帮你保留15分钟时间,如果15分钟后还没付款那么不好意思系统会自动把座位释放掉。怎么实现类似的功能呢?可以用定时任务每分钟扫一次,发现有占座超过15分钟还没付款的就释放掉。但是这样做很低效,很多时候做的都是些无用功;可以用分布式锁、分布式缓存的被动过期时间,15分钟过期后锁也释放了,缓存key也不存在了;还可以用延迟队列
2020-11-13 09:03:57
174
原创 kafak-消费者
kafak-消费者消费者从订阅的主题消费消息,消费消息的偏移量保存在Kafka的名字是 __consumer_offsets 的主题中。消费者还可以将自己的偏移量存储到Zookeeper,需要设置offset.storage=zookeeper。推荐使用Kafka存储消费者的偏移量。因为Zookeeper不适合高并发多个从同一个主题消费的消费者可以加入到一个消费组中。消费组中的消费者共享group_id。configs.put(“group.id”, “xxx”);group_id一般设置为应
2020-11-13 08:55:57
204
原创 kafka-生产者消息发送流程
消息发送Producer创建时,会创建一个Sender线程并设置为守护线程。生产消息时,内部其实是异步流程;生产的消息先经过拦截器->序列化器->分区器,然后将消息缓存在缓冲区(该缓冲区也是在Producer创建时创建)。批次发送的条件为:缓冲区数据大小达到batch.size或者linger.ms达到上限,哪个先达到就算哪个。批次发送后,发往指定分区,然后落盘到broker;如果生产者配置了retrires参数大于0并且失败原因允许重试,那么客户端内部会对该消息进行重试。落盘到b
2020-11-12 10:02:50
926
原创 kafak-服务端参数配置
服务端参数配置$KAFKA_HOME/config/server.properties文件中的配置zookeeper.connect该参数用于配置Kafka要连接的Zookeeper/集群的地址。它的值是一个字符串,使用逗号分隔Zookeeper的多个地址。Zookeeper的单个地址是 host:port形式的,可以在最后添加Kafka在Zookeeper中的根节点路径zookeeper.connect=node2:2181,node3:2181,node4:2181/myKafkali
2020-11-11 19:55:23
594
原创 kafka-客户端发送消息
消息的发送与接收生产者主要的对象有: KafkaProducer , ProducerRecord 。其中 KafkaProducer 是用于发送消息的类, ProducerRecord 类用于封装Kafka的消息。KafkaProducer 的创建需要指定的参数和含义其他参数可以从 org.apache.kafka.clients.producer.ProducerConfig 中找到。我们后面的内容会介绍到。消费者生产消息后,需要broker端的确认,可以同步确认,也可以异步确认。同步
2020-11-11 17:29:14
693
原创 Kafka 单机的安装与配置
安装Zookeeperhttps://blog.csdn.net/ko0491/article/details/1076976591、上传kafka_2.12-1.0.2.tgz到服务器并解压tar -zxf kafka_2.12-1.0.2.tgz -C /opt2、配置环境变量并生效vim /etc/profile3、配置/opt/kafka_2.12-1.0.2/config中的server.properties文件:Kafka连接Zookeeper的地址,此处使用本地启动的Z
2020-11-11 14:37:33
252
1
原创 Kafka-核心概念
Producer-生产者生产者创建消息。该角色将消息发布到Kafka的topic中。broker接收到生产者发送的消息后,broker将该消息追加到当前用于追加数据的 segment 文件中。一般情况下,一个消息会被发布到一个特定的主题上默认情况下通过轮询把消息均衡地分布到主题的所有分区上。在某些情况下,生产者会把消息直接写到指定的分区。这通常是通过消息键和分区器来实现的,分区器为键生成一个散列值,并将其映射到指定的分区上。这样可以保证包含同一个键的消息会被写到同一个分区上。生产者也可以使用自
2020-11-11 11:25:42
273
1
原创 Kafka-基本概念
Kafka介绍Kafka是最初由Linkedin公司开发,是一个分布式、分区的、多副本的、多生产者、多订阅者,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/nginx日志、访问日志,消息服务等等,Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目。主要应用场景是:日志收集系统和消息系统。Kafka主要设计目标如下:以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间的访问性能。高吞吐率。即使在非常
2020-11-11 10:42:16
196
原创 Rabbitmq-集群管理
集群管理3台虚拟机192.168.181.140-node-linux140192.168.181.141-node-linux141192.168.181.142-node-linux142安装在linux140、linux141、linux142三台Linux虚拟机中安装RabbitMQ从linux140拷贝.erlang.cookie到nodlinux141e3、linux142的相应目录如果没有该文件,手动创建 /var/lib/rabbitmq/.erlang.cookie ,生
2020-11-09 19:58:22
939
2
原创 Rabbitmq-死信队列
死信队列用户下单,调用订单服务,然后订单服务调用派单系统通知外卖人员送单,这时候订单系统与派单系统 采用 MQ异步通讯在定义业务队列时可以考虑指定一个 死信交换机,并绑定一个死信队列。当消息变成死信时,该消息就会被发送到该死信队列上,这样方便我们查看消息失败的原因。DLX,全称为Dead-Letter-Exchange,死信交换器。消息在一个队列中变成死信(Dead Letter)之后,被重新发送到一个特殊的交换器(DLX)中,同时,绑定DLX的队列就称为“死信队列”。以下几种情况导致消息变为死
2020-11-05 21:27:02
127
原创 RabbitMq- TTL机制
在京东下单,订单创建成功,等待支付,一般会给30分钟的时间,开始倒计时。如果在这段时间内用户没有支付,则默认订单取消。该如何实现?定期轮询(数据库等)用户下单成功,将订单信息放入数据库,同时将支付状态放入数据库,用户付款更改数据库状态。定期轮询数据库支付状态,如果超过30分钟就将该订单取消。优点:设计实现简单缺点:需要对数据库进行大量的IO操作,效率低下。TimerSimpleDateFormat simpleDateFormat = newSimpleDateFormat(.
2020-11-05 21:21:38
752
原创 RabbitMq - 消息可靠性
消息可靠性分布式锁这个比较容易理解,就是在操作某条数据时先锁定,可以用redis或zookeeper等常用框架来实现。 比如我们在修改账单时,先锁定该账单,如果该账单有并发操作,后面的操作只能等待上一个操作的锁释放后再依次执行。优点:能够保证数据强一致性。 缺点:高并发场景下可能有性能问题消息队列 消息队列是为了保证最终一致性,我们需要确保消息队列有ack机制 客户端收到消息并消费处理完成后,客户端发送ack消息给消息中间件 如果消息中间件超过指定时间还没收到ack消息,则定时去重发消息比如我
2020-11-05 21:14:17
450
1
原创 RabbitMq Connection 和Channel关系
Connection 和Channel关系生产者和消费者,需要与RabbitMQ Broker 建立TCP连接,也就是Connection 。一旦TCP 连接建立起来,客户端紧接着创建一个AMQP 信道(Channel),每个信道都会被指派一个唯一的ID。信道是建立在Connection 之上的虚拟连接, RabbitMQ 处理的每条AMQP 指令都是通过信道完成的为什么不直接使用TCP连接,而是使用信道?RabbitMQ 采用类似NIO的做法,复用TCP 连接,减少性能开销,便于管理。当每个信道
2020-11-03 20:45:48
1422
原创 RabbitMQ工作流程
RabbitMQ工作流程生产者发送消息的流程生产者连接RabbitMQ,建立TCP连接( Connection),开启信道(Channel)生产者声明一个Exchange(交换器),并设置相关属性,比如交换器类型、是否持久化等生产者声明一个队列井设置相关属性,比如是否排他、是否持久化、是否自动删除等生产者通过 bindingKey (绑定Key)将交换器和队列绑定( binding )起来生产者发送消息至RabbitMQ Broker,其中包含 routingKey (路由键)、交换器等信息
2020-11-03 19:17:05
294
原创 安装和配置RabbitMQ
安装和配置RabbitMQRabbitMQ的安装需要首先安装Erlang,因为它是基于Erlang的VM运行的。RabbitMQ需要的依赖:socat和logrotate,logrotate操作系统中已经存在了,只需要安装socat就可以了。RabbitMQ与Erlang的兼容关系详见:https://www.rabbitmq.com/which-erlang.html安装rabbitmq安装依赖yum install socat -y安装Erlangerlang-23.0.2-
2020-11-03 18:59:06
94
原创 RabbitMQ介绍、概念、基本架构
RabbitMQ介绍、概念、基本架构RabbitMQ介绍RabbitMQ,俗称“兔子MQ”(可见其轻巧,敏捷),是目前非常热门的一款开源消息中间件,不管是互联网行业还是传统行业都广泛使用(最早是为了解决电信行业系统之间的可靠通信而设计)。高可靠性、易扩展、高可用、功能丰富等支持大多数(甚至冷门)的编程语言客户端。RabbitMQ遵循AMQP协议,自身采用Erlang(一种由爱立信开发的通用面向并发编程的语言)编写。RabbitMQ也支持MQTT等其他协议。RabbitMQ具有很强大
2020-11-03 18:50:17
3398
1
原创 RabbitMQ常用操作命令
RabbitMQ常用操作命令# 前台启动Erlang VM和RabbitMQrabbitmq-server# 后台启动rabbitmq-server -detached# 停止RabbitMQ和Erlang VMrabbitmqctl stop# 查看所有队列rabbitmqctl list_queues# 查看所有虚拟主机rabbitmqctl list_vhosts# 在Erlang VM运行的情况下启动RabbitMQ应用rabbitmqctl start_apprabbi
2020-11-03 17:48:59
409
原创 Guava Cache原理
基本用法构建 public static void initCache(LoadingCache cache) throws ExecutionException { for(int i =1;i<=3;i++){ //连接数据源 ,如果缓存没有就读取数据源 cache.get(String.valueOf(i)); } } /** * 获得当前缓存的记录 * @pa
2020-10-27 10:16:07
499
原创 redis-Cluster-环境搭建
官方cluster分区Redis3.0之后,Redis官方提供了完整的集群解决方案。方案采用去中心化的方式,包括:sharding(分区)、replication(复制)、failover(故障转移)。称为RedisCluster。Redis5.0前采用redis-trib进行集群的创建和管理,需要ruby支持Redis5.0可以直接使用Redis-cli进行集群的创建和管理去中心化RedisCluster由多个Redis节点组构成,是一个P2P无中心节点的集群架构,依靠Gossip协议传播
2020-10-24 11:05:30
345
原创 redis-哨兵模式-搭建
哨兵模式哨兵(sentinel)是Redis的高可用性(High Availability)的解决方案:由一个或多个sentinel实例组成sentinel集群可以监视一个或多个主服务器和多个从服务器。当主服务器进入下线状态时,sentinel可以将该主服务器下的某一从服务器升级为主服务器继续提供服务,从而保证redis的高可用性系统centos 7下载随便找个地方下载cd /usr/local/rediswget https://download.redis.io/releases/r
2020-10-23 11:07:14
4914
6
原创 redis-官方cluster分区
分区与集群https://blog.csdn.net/ko0491/article/details/109218004proxy分区https://blog.csdn.net/ko0491/article/details/109218776官方cluster分区Redis3.0之后,Redis官方提供了完整的集群解决方案。方案采用去中心化的方式,包括:sharding(分区)、replication(复制)、failover(故障转移)。称为RedisCluster。Redis5.0前采用r
2020-10-22 12:18:34
490
原创 redis-proxy端分区
分区https://blog.csdn.net/ko0491/article/details/109218004proxy端分区在客户端和服务器端引入一个代理或代理集群,客户端将命令发送到代理上,由代理根据算法,将命令路由到相应的服务器上。常见的代理有Codis(豌豆荚)和TwemProxy(Twitter)部署架构Codis由豌豆荚于2014年11月开源,基于Go和C开发,是近期涌现的、国人开发的优秀开源软件之一Codis 3.x 由以下组件组成:Codis Server:基于 redis
2020-10-22 11:52:08
664
1
expert+one-on-one+j2ee+development+without+ejb中文版.rar
2020-04-27
Eclipse如何导入web项目,导入后项目显示红叉,也无法在tomcat中运行
2015-01-31
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅