Flink 消费RabbitMQ 和 Kafka
- 在消息RabbitMQ时,我们关心的一个问题是手动ack还是自动ack,如果是自动ack就怕出现丢消息的情况
- Flink以RabbitMQ作为Source,是怎么保证消息唯一性的呢,是怎么保证ack的.
- 首先引入依赖包
- <dependency>
- <groupId>org.apache.flink</groupId>
- <artifactId>flink-connector-kafka-0.10_${scala.version}</artifactId>
- <version>${flink.version}</version>
- </dependency>
- RMQSource类,可以看到如果设置了checkpointing,则默认autoAck是false,是手动控制提交的
那什么时候提交呢,flink checkpointing有个时间间隔,每次checkpointing触发时,才能ack,也就是说,不是一条消息ack一下,而是定时ack
这个跟kafka,update offset一样,都是在checkpoint的时候处理- @Override
- public void open(Configuration config) throws Exception {
- super.open(config);
- ConnectionFactory factory = setupConnectionFactory();
- try {
- connection = factory.newConnection();
- channel = connection.createChannel();
- if (channel == null) {
- throw new RuntimeException("None of RabbitMQ channels are available");
- }
- setupQueue();
- consumer = new QueueingConsumer(channel);
- RuntimeContext runtimeContext = getRuntimeContext();
- if (runtimeContext instanceof StreamingRuntimeContext
- && ((StreamingRuntimeContext) runtimeContext).isCheckpointingEnabled()) {
- autoAck = false;
- // enables transaction mode
- channel.txSelect();
- } else {
- autoAck = true;
- }
- LOG.debug("Starting RabbitMQ source with autoAck status: " + autoAck);
- channel.basicConsume(queueName, autoAck, consumer);
- } catch (IOException e) {
- throw new RuntimeException("Cannot create RMQ connection with " + queueName + " at "
- + rmqConnectionConfig.getHost(), e);
- }
- running = true;
- }
- RMQSource
- @Override
- public void run(SourceContext<OUT> ctx) throws Exception {
- while (running) {
- QueueingConsumer.Delivery delivery = consumer.nextDelivery();
- synchronized (ctx.getCheckpointLock()) {
- OUT result = schema.deserialize(delivery.getBody());
- if (schema.isEndOfStream(result)) {
- break;
- }
- if (!autoAck) {
- final long deliveryTag = delivery.getEnvelope().getDeliveryTag();
- if (usesCorrelationId) {
- final String correlationId = delivery.getProperties().getCorrelationId();
- Preconditions.checkNotNull(correlationId, "RabbitMQ source was instantiated " +
- "with usesCorrelationId set to true but a message was received with " +
- "correlation id set to null!");
- if (!addId(correlationId)) {
- // we have already processed this message
- continue;
- }
- }
- sessionIds.add(deliveryTag);
- }
- ctx.collect(result);
- }
- }
- }
- @Override
- protected void acknowledgeSessionIDs(List<Long> sessionIds) {
- try {
- for (long id : sessionIds) {
- channel.basicAck(id, false);
- }
- channel.txCommit();
- } catch (IOException e) {
- throw new RuntimeException("Messages could not be acknowledged during checkpoint creation.", e);
- }
- }
Flink 消费RabbitMQ 和 Kafka的更多相关文章
- Flink消费Kafka数据并把实时计算的结果导入到Redis
1. 完成的场景 在很多大数据场景下,要求数据形成数据流的形式进行计算和存储.上篇博客介绍了Flink消费Kafka数据实现Wordcount计算,这篇博客需要完成的是将实时计算的结果写到redis. ...
- Flink消费Kafka到HDFS实现及详解
1.概述 最近有同学留言咨询,Flink消费Kafka的一些问题,今天笔者将用一个小案例来为大家介绍如何将Kafka中的数据,通过Flink任务来消费并存储到HDFS上. 2.内容 这里举个消费Kaf ...
- Flink消费kafka
Flink消费Kafka https://blog.csdn.net/boling_cavalry/article/details/85549434 https://www.cnblogs.com/s ...
- RabbitMQ和Kafka
转自通九大神的博客 起因 最近公司RabbitMQ的集群出了点问题,然后有些亲就说RabbitMQ慢且不好用,是一个瓶颈,不如换成Kafka.而我本人,使用RabbitMQ有一点久了,认为这个事情应当 ...
- RabbitMQ和Kafka到底怎么选(二)?
前言 前一篇文章<RabbitMQ和Kafka到底怎么选?>,我们在吞吐量方面比较了Kafka和RabbitMQ,知道了Kafka的吞吐量要高于RabbitMQ.本文从可靠性方面继续探讨两 ...
- RabbitMQ和Kafka到底怎么选?
前言 开源社区有好多优秀的队列中间件,比如RabbitMQ和Kafka,每个队列都貌似有其特性,在进行工程选择时,往往眼花缭乱,不知所措.对于RabbitMQ和Kafka,到底应该选哪个? Rabbi ...
- RabbitMQ 和 Kafka
============================RabbitMQ 术语============================RabbitMQ 有很多术语和Kafka不一样, 理解这些术语十分 ...
- 关于ActiveMQ、RocketMQ、RabbitMQ、Kafka一些总结和区别
这是一篇分享文 转自:http://www.cnblogs.com/williamjie/p/9481780.html 尊重原作,谢谢 消息队列 为什么写这篇文章? 博主有两位朋友分别是小A和小B: ...
- RabbitMQ和Kafka对比以及场景使用说明
我目前的项目最后使用的是RabbitMQ,这里依然是结合网上大神们的优秀博客,对kafka和rabbitmq进行简单的比对.最后附上参考博客. 1.架构模型 rabbitmq RabbitMQ遵循AM ...
- RabbitMQ和Kafka,更加便捷高效的消息队列使用方式,请放心食用
一.RabbitMQ实例介绍RabbitMQ实例由华为云分布式消息服务(DMS)团队打造,实例采用物理隔离的方式部署,租户独占RabbitMQ实例.一键式部署,完全兼容开源RabbitMQ的使用方式, ...
随机推荐
- vue element-ui table 实现自动滚动效果
<el-table :data="tableData" stripe class="swiper-page-table" ref="table& ...
- PostgreSQL性能优化综合案例 - 2
[调优阶段8] 1. 压力测试 pgbench -M prepared -r -c 1 -f /home/postgres/test/login0.sql -j 1 -n -T 180 -h 172. ...
- ROS服务通信(C++)
ROS服务通信C++ 效果图 结构总览 友情提醒 每一步编辑完,执行一下 Ctrl+Shift+B进行编译,及时排查错误 准备工作 第一步:创建工作空间 配置:roscpp rospy std_msg ...
- axios 进行同步请求(async+await+promise)
axios 进行同步请求(async+await+promise) 遇到的问题介绍 将axios的异步请求改为同步请求想到了async 和await.Promise axios介绍 Axios 是一个 ...
- vue模板三目运算判断报错
问题: 关于vue三目运算符提示报错 1.三目运算符等于判断 {{ a==b ? '是' : '否'}} 2.其他三目运算符 <代表小于号(<) >代表大于符号(>) ≤表示小 ...
- []Linux 离线升级Openssh与Openssl版本
https://blog.csdn.net/qq_45728838/article/details/120825845 离线的意思是为Linux无法链接网络,只能通过windows 将文件上传一.首先 ...
- 计算机存储内部数据的原理,编程语言的发展史和分类,python解释器的下载和安装,计算机cmd窗口的使用,环境变量和解释器多版本共存方法
计算机内部存储数据的原理 计算机内部只认识01二进制. 存储单位:0和1分别代表一个比特位(bit).8bit=1bytes(字节) 1024kb=1MB 1024MB=1GB 1024GB=1TB ...
- 在orangepi 3 lts使用high speed timer
概述 在allwin H6的用户手册上可以发现全志H6芯片支持普通计时器和高速计时器. 普通计时器可以处理低频定时任务,其时钟源包括LOSC和OSC,前者频率为32768Hz,后者为24MHz. 高数 ...
- QP之QEP事件分配流程分析
*********************************1*********************************** QActive *AO_Blinky = &l_bl ...
- MySQL-存储引擎-索引
事务 方式1:set @@autocommit = 0 -- 将事务提交方式设置为手动 方式2:start transaction -- 开启事务 事务四大特性ACID: A:原子性(Atomicit ...