1. 在消息RabbitMQ时,我们关心的一个问题是手动ack还是自动ack,如果是自动ack就怕出现丢消息的情况
  2. FlinkRabbitMQ作为Source,是怎么保证消息唯一性的呢,是怎么保证ack的.
  1. 首先引入依赖包
  2. <dependency>
  3. <groupId>org.apache.flink</groupId>
  4. <artifactId>flink-connector-kafka-0.10_${scala.version}</artifactId>
  5. <version>${flink.version}</version>
  6. </dependency>
  1. RMQSource类,可以看到如果设置了checkpointing,则默认autoAckfalse,是手动控制提交的
    那什么时候提交呢,flink checkpointing有个时间间隔,每次checkpointing触发时,才能ack,也就是说,不是一条消息ack一下,而是定时ack
    这个跟kafka,update offset一样,都是在checkpoint的时候处理
  2.  
  3. @Override
  4. public void open(Configuration config) throws Exception {
  5. super.open(config);
  6. ConnectionFactory factory = setupConnectionFactory();
  7. try {
  8. connection = factory.newConnection();
  9. channel = connection.createChannel();
  10. if (channel == null) {
  11. throw new RuntimeException("None of RabbitMQ channels are available");
  12. }
  13. setupQueue();
  14. consumer = new QueueingConsumer(channel);
  15.  
  16. RuntimeContext runtimeContext = getRuntimeContext();
  17. if (runtimeContext instanceof StreamingRuntimeContext
  18. && ((StreamingRuntimeContext) runtimeContext).isCheckpointingEnabled()) {
  19. autoAck = false;
  20. // enables transaction mode
  21. channel.txSelect();
  22. } else {
  23. autoAck = true;
  24. }
  25.  
  26. LOG.debug("Starting RabbitMQ source with autoAck status: " + autoAck);
  27. channel.basicConsume(queueName, autoAck, consumer);
  28.  
  29. } catch (IOException e) {
  30. throw new RuntimeException("Cannot create RMQ connection with " + queueName + " at "
  31. + rmqConnectionConfig.getHost(), e);
  32. }
  33. running = true;
  34. }
  1. RMQSource
  2.  
  3. @Override
  4. public void run(SourceContext<OUT> ctx) throws Exception {
  5. while (running) {
  6. QueueingConsumer.Delivery delivery = consumer.nextDelivery();
  7.  
  8. synchronized (ctx.getCheckpointLock()) {
  9.  
  10. OUT result = schema.deserialize(delivery.getBody());
  11.  
  12. if (schema.isEndOfStream(result)) {
  13. break;
  14. }
  15.  
  16. if (!autoAck) {
  17. final long deliveryTag = delivery.getEnvelope().getDeliveryTag();
  18. if (usesCorrelationId) {
  19. final String correlationId = delivery.getProperties().getCorrelationId();
  20. Preconditions.checkNotNull(correlationId, "RabbitMQ source was instantiated " +
  21. "with usesCorrelationId set to true but a message was received with " +
  22. "correlation id set to null!");
  23. if (!addId(correlationId)) {
  24. // we have already processed this message
  25. continue;
  26. }
  27. }
  28. sessionIds.add(deliveryTag);
  29. }
  30.  
  31. ctx.collect(result);
  32. }
  33. }
  34. }
  1. @Override
  2. protected void acknowledgeSessionIDs(List<Long> sessionIds) {
  3. try {
  4. for (long id : sessionIds) {
  5. channel.basicAck(id, false);
  6. }
  7. channel.txCommit();
  8. } catch (IOException e) {
  9. throw new RuntimeException("Messages could not be acknowledged during checkpoint creation.", e);
  10. }
  11. }

Flink 消费RabbitMQ 和 Kafka的更多相关文章

  1. Flink消费Kafka数据并把实时计算的结果导入到Redis

    1. 完成的场景 在很多大数据场景下,要求数据形成数据流的形式进行计算和存储.上篇博客介绍了Flink消费Kafka数据实现Wordcount计算,这篇博客需要完成的是将实时计算的结果写到redis. ...

  2. Flink消费Kafka到HDFS实现及详解

    1.概述 最近有同学留言咨询,Flink消费Kafka的一些问题,今天笔者将用一个小案例来为大家介绍如何将Kafka中的数据,通过Flink任务来消费并存储到HDFS上. 2.内容 这里举个消费Kaf ...

  3. Flink消费kafka

    Flink消费Kafka https://blog.csdn.net/boling_cavalry/article/details/85549434 https://www.cnblogs.com/s ...

  4. RabbitMQ和Kafka

    转自通九大神的博客 起因 最近公司RabbitMQ的集群出了点问题,然后有些亲就说RabbitMQ慢且不好用,是一个瓶颈,不如换成Kafka.而我本人,使用RabbitMQ有一点久了,认为这个事情应当 ...

  5. RabbitMQ和Kafka到底怎么选(二)?

    前言 前一篇文章<RabbitMQ和Kafka到底怎么选?>,我们在吞吐量方面比较了Kafka和RabbitMQ,知道了Kafka的吞吐量要高于RabbitMQ.本文从可靠性方面继续探讨两 ...

  6. RabbitMQ和Kafka到底怎么选?

    前言 开源社区有好多优秀的队列中间件,比如RabbitMQ和Kafka,每个队列都貌似有其特性,在进行工程选择时,往往眼花缭乱,不知所措.对于RabbitMQ和Kafka,到底应该选哪个? Rabbi ...

  7. RabbitMQ 和 Kafka

    ============================RabbitMQ 术语============================RabbitMQ 有很多术语和Kafka不一样, 理解这些术语十分 ...

  8. 关于ActiveMQ、RocketMQ、RabbitMQ、Kafka一些总结和区别

    这是一篇分享文 转自:http://www.cnblogs.com/williamjie/p/9481780.html  尊重原作,谢谢 消息队列 为什么写这篇文章? 博主有两位朋友分别是小A和小B: ...

  9. RabbitMQ和Kafka对比以及场景使用说明

    我目前的项目最后使用的是RabbitMQ,这里依然是结合网上大神们的优秀博客,对kafka和rabbitmq进行简单的比对.最后附上参考博客. 1.架构模型 rabbitmq RabbitMQ遵循AM ...

  10. RabbitMQ和Kafka,更加便捷高效的消息队列使用方式,请放心食用

    一.RabbitMQ实例介绍RabbitMQ实例由华为云分布式消息服务(DMS)团队打造,实例采用物理隔离的方式部署,租户独占RabbitMQ实例.一键式部署,完全兼容开源RabbitMQ的使用方式, ...

随机推荐

  1. vue element-ui table 实现自动滚动效果

    <el-table :data="tableData" stripe class="swiper-page-table" ref="table& ...

  2. PostgreSQL性能优化综合案例 - 2

    [调优阶段8] 1. 压力测试 pgbench -M prepared -r -c 1 -f /home/postgres/test/login0.sql -j 1 -n -T 180 -h 172. ...

  3. ROS服务通信(C++)

    ROS服务通信C++ 效果图 结构总览 友情提醒 每一步编辑完,执行一下 Ctrl+Shift+B进行编译,及时排查错误 准备工作 第一步:创建工作空间 配置:roscpp rospy std_msg ...

  4. axios 进行同步请求(async+await+promise)

    axios 进行同步请求(async+await+promise) 遇到的问题介绍 将axios的异步请求改为同步请求想到了async 和await.Promise axios介绍 Axios 是一个 ...

  5. vue模板三目运算判断报错

    问题: 关于vue三目运算符提示报错 1.三目运算符等于判断 {{ a==b ? '是' : '否'}} 2.其他三目运算符 <代表小于号(<) >代表大于符号(>) ≤表示小 ...

  6. []Linux 离线升级Openssh与Openssl版本

    https://blog.csdn.net/qq_45728838/article/details/120825845 离线的意思是为Linux无法链接网络,只能通过windows 将文件上传一.首先 ...

  7. 计算机存储内部数据的原理,编程语言的发展史和分类,python解释器的下载和安装,计算机cmd窗口的使用,环境变量和解释器多版本共存方法

    计算机内部存储数据的原理 计算机内部只认识01二进制. 存储单位:0和1分别代表一个比特位(bit).8bit=1bytes(字节) 1024kb=1MB 1024MB=1GB 1024GB=1TB ...

  8. 在orangepi 3 lts使用high speed timer

    概述 在allwin H6的用户手册上可以发现全志H6芯片支持普通计时器和高速计时器. 普通计时器可以处理低频定时任务,其时钟源包括LOSC和OSC,前者频率为32768Hz,后者为24MHz. 高数 ...

  9. QP之QEP事件分配流程分析

    *********************************1*********************************** QActive *AO_Blinky = &l_bl ...

  10. MySQL-存储引擎-索引

    事务 方式1:set @@autocommit = 0 -- 将事务提交方式设置为手动 方式2:start transaction -- 开启事务 事务四大特性ACID: A:原子性(Atomicit ...