消息机制

Kafka设计解析(八)- Kafka事务机制与Exactly Once语义实现原理

 ̄綄美尐妖づ 提交于 2019-12-05 02:14:05
写在前面的话 本文所有Kafka原理性的描述除特殊说明外均基于Kafka 1.0.0版本。 为什么要提供事务机制 Kafka事务机制的实现主要是为了支持 Exactly Once 即正好一次语义 操作的原子性 有状态操作的可恢复性 Exactly Once 《 Kafka背景及架构介绍 》一文中有说明Kafka在0.11.0.0之前的版本中只支持 At Least Once 和 At Most Once 语义,尚不支持 Exactly Once 语义。 但是在很多要求严格的场景下,如使用Kafka处理交易数据, Exactly Once 语义是必须的。我们可以通过让下游系统具有幂等性来配合Kafka的 At Least Once 语义来间接实现 Exactly Once 。但是: 该方案要求下游系统支持幂等操作,限制了Kafka的适用场景 实现门槛相对较高,需要用户对Kafka的工作机制非常了解 对于Kafka Stream而言,Kafka本身即是自己的下游系统,但Kafka在0.11.0.0版本之前不具有幂等发送能力 因此,Kafka本身对 Exactly Once 语义的支持就非常必要。 操作原子性 操作的原子性是指,多个操作要么全部成功要么全部失败,不存在部分成功部分失败的可能。 实现原子性操作的意义在于: 操作结果更可控,有助于提升数据一致性 便于故障恢复。因为操作是原子的

带你手把手重读 Handler 源码,聊聊那些你所不知道一二三

谁都会走 提交于 2019-12-04 21:04:54
大家应该都知道,Android 的消息机制是基于 Handler 实现的。还记得一年前的自己就看了几篇博客,知道了 Handler、Looper、MessageQueue 就自以为了解了 Handler 的原理。但其实看源码的过程中慢慢就会发现,Handler 的内容可不止这点, 像同步屏障、 Handler 的 native 层的阻塞唤醒机制等等这些知识以前就没有理解清楚。因此写下这篇文章,从头开始重塑对 Handler 的印象。 觉得文章太长的可以找我拿了完整的PDF自行研究 参考: (更多完整项目下载。未完待续。源码。图文知识后续上传github。) 可以点击 关于我 联系我获取完整PDF ( VX:mm14525201314 ) Handler 采用的是一种生产者-消费者模型,Handler 就是生产者,通过它可以生产需要执行的任务。而 Looper 则是消费者,不断从 MessageQueue 中取出 Message 对这些消息进行消费,下面我们看一下其具体的实现。 发送消息 post & sendMessage 首先我们都知道,Handler 对外主要有两种方式来实现在其所在 Looper 所在线程执行指定 Runnable ——post 及 sendMessage ,它们都有对应的 delay 方法 。而不论是 post 还是 sendMessage ,都会调用到

Handler消息传递机制分析

て烟熏妆下的殇ゞ 提交于 2019-12-04 12:33:38
Handler的用途和用法 写过Android程序的人大概都会遇到ANR(Application Not Responding)。如果程序在一段时间内没有响应,系统就会弹出一个对话框,让用户选择继续等待还是强制关闭应用。为了避免ANR,我们需要把耗时的逻辑放到后台线程里执行。但是后台线程无法更新界面。那么当任务完成后,如何根据结果更新界面呢?Handler就可以承担这个职责。下面的例子展示了Handler的用法: package com.tq.handlerdemo; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.widget.TextView; public class MainActivity extends AppCompatActivity { private static final int UPDATE_TEXT = 1; private TextView textView; Thread backgroundThread = new Thread(new Runnable() { @Override public void run

MFC中消息映射机制(BEGIN_MESSAGE_MAP和END_MESSAGE_MAP)

被刻印的时光 ゝ 提交于 2019-12-04 12:05:01
DECLARE_MESSAGE_MAP() BEGIN_MESSAGE_MAP(CtestDialogDlg, CDialogEx) ON_WM_PAINT() //OnPaint() ON_WM_QUERYDRAGICON() // ON_WM_SYSCOMMAND() //OnSysCommand() ON_WM_SIZE() //OnSize() ON_MESSAGE(WM_USER_MSG, &CtestDialogDlg::OnUserMsg) //自定义消息 ... END_MESSAGE_MAP() 自定义消息的步骤: 1. 头文件中 #define WM_USER_MSG (WM_USER + 1) afx_msg LRESULT OnUserMsg(WPARAM wParam, LPARAM lParam); 2. cpp文件中 BEGIN_MESSAGE_MAP(CtestDialogDlg, CDialogEx) ON_MESSAGE(WM_USER_MSG, &CtestDialogDlg::OnUserMsg) //自定义消息 END_MESSAGE_MAP() afx_msg LRESULT CtestDialogDlg::OnUserMsg(WPARAM wParam, LPARAM lParam) { return 0; } 来源: https:/

MQ如何保证消息的可靠性传输

时光毁灭记忆、已成空白 提交于 2019-12-04 04:14:01
问题 如何保证消息的可靠性传输?或者说,如何处理消息丢失的问题? 数据的丢失问题,可能出现在生产者、MQ、消费者中,从 RabbitMQ 和 Kafka 分别来分析一下吧。 RabbitMQ 生产者弄丢了数据 生产者将数据发送到 RabbitMQ 的时候,可能数据就在半路给搞丢了,因为网络问题啥的,都有可能。 此时可以选择用 RabbitMQ 提供的事务功能,就是生产者发送数据之前开启 RabbitMQ 事务channel.txSelect,然后发送消息,如果消息没有成功被 RabbitMQ 接收到,那么生产者会收到异常报错,此时就可以回滚事务channel.txRollback,然后重试发送消息;如果收到了消息,那么可以提交事务channel.txCommit。 // 开启事务 channel.txSelect try { // 这里发送消息 } catch (Exception e) { channel.txRollback // 这里再次重发这条消息 } // 提交事务 channel.txCommit 但是问题是,RabbitMQ 事务机制(同步)一搞,基本上吞吐量会下来,因为太耗性能。 所以一般来说,如果要确保说写 RabbitMQ 的消息别丢,可以开启 confirm 模式,在生产者那里设置开启 confirm 模式之后,你每次写的消息都会分配一个唯一的 id

如何保证消息的可靠性传输(如何处理消息丢失的问题)

送分小仙女□ 提交于 2019-12-04 04:12:53
我们在使用MQ的时候有个原则:数据不能多一条,不能少一条,不能多就是不能重复消费以及幂等性问题。不能少,就是说这数据不能搞丢。 如果说我们是用mq来传递非常核心的消息,比如说计费扣费的一些消息,计费系统是很重要的一个业务,操作很耗时。实际上我们将计费系统做成异步化,然后中间就是加一个MQ。 以下是消息丢失的一些分析: 这个丢失数据,mq一般分为两种,要么是mq自己弄丢的,要么是我们消费的时候弄丢了。 rabbitmq这种mq,一般来说都是承载公司的核心业务的,数据是绝对不能弄丢的。 1.rabbitmq (1)生产者弄丢了数据 生产者将数据发送到rabbitmq的时候,可能数据就在半路给搞丢了,因为网络啥的问题,都有可能。 此时选择用rabbitmq提供的事务功能,就是生产者发送数据之前开启rabbitmq事务,然后发送消息,如果消息没有成功被rabbitmq接收到,那么生产者会收到异常报错,此时就可以回滚事务,然后重试发送消息;如果收到了消息,那么可以提供事务。但是问题是,rabbitmq事务机制一搞,基本上吞吐量会下来,因为太耗性能。 所以一般来说。如果我们要确保说写rabbitmq的消息别丢,可以开启confirm模式,在生产者那里设置开启confirm模式之后,你每次写的消息都会分配一个唯一的id,然后如果写入了rabbitmq中,rabbitmq会给你回传一个ack消息

如何保证消息队列的可靠性传输?

血红的双手。 提交于 2019-12-04 04:05:14
面试题 如何保证消息的可靠性传输?或者说,如何处理消息丢失的问题? 面试官心理分析 这个是肯定的,用 MQ 有个基本原则,就是 数据不能多一条,也不能少一条 ,不能多,就是前面说的重复消费和幂等性问题。不能少,就是说这数据别搞丢了。那这个问题你必须得考虑一下。 如果说你这个是用 MQ 来传递非常核心的消息,比如说计费、扣费的一些消息,那必须确保这个 MQ 传递过程中 绝对不会把计费消息给弄丢 。 面试题剖析 数据的丢失问题,可能出现在生产者、MQ、消费者中,咱们从 RabbitMQ 和 Kafka 分别来分析一下吧。 RabbitMQ 生产者弄丢了数据 生产者将数据发送到 RabbitMQ 的时候,可能数据就在半路给搞丢了,因为网络问题啥的,都有可能。 此时可以选择用 RabbitMQ 提供的事务功能,就是生产者 发送数据之前 开启 RabbitMQ 事务 channel.txSelect ,然后发送消息,如果消息没有成功被 RabbitMQ 接收到,那么生产者会收到异常报错,此时就可以回滚事务 channel.txRollback ,然后重试发送消息;如果收到了消息,那么可以提交事务 channel.txCommit 。 // 开启事务 channel.txSelect try { // 这里发送消息 } catch (Exception e) { channel

消息中间件面试题:消息丢失怎么办?

♀尐吖头ヾ 提交于 2019-12-04 04:04:01
面试题 如何保证消息的可靠性传输?或者说,如何处理消息丢失的问题? 如果说你这个是用 MQ 来传递非常核心的消息,比如说计费、扣费的一些消息,那必须确保这个 MQ 传递过程中 绝对不会把计费消息给弄丢 。 消息中间件各种面试题: 消息中间件面试题:消息丢失怎么办? 消息中间件面试题:消息队列的优缺点,区别 消息中间件面试题:消息中间件的高可用 消息中间件面试题:如何保证消息的顺序性 消息中间件面试题:如何保证消息不被重复消费 消息中间件面试题:如何解决消息队列的延时以及过期失效问题?消息队列满了以后该怎么处理?有几百万消息持续积压几小时呢? 消息中间件面试题:如果让你写一个消息队列,该如何进行架构设计? 面试题剖析 数据的丢失问题,可能出现在生产者、MQ、消费者中,咱们从 RabbitMQ 和 Kafka 分别来分析一下吧。 RabbitMQ 生产者弄丢了数据 生产者将数据发送到 RabbitMQ 的时候,可能数据就在半路给搞丢了,因为网络问题啥的,都有可能。 此时可以选择用 RabbitMQ 提供的事务功能,就是生产者 发送数据之前 开启 RabbitMQ 事务 channel.txSelect ,然后发送消息,如果消息没有成功被 RabbitMQ 接收到,那么生产者会收到异常报错,此时就可以回滚事务 channel.txRollback ,然后重试发送消息;如果收到了消息

如何保证消息的可靠性传输

孤街浪徒 提交于 2019-12-04 04:03:41
如何保证消息的可靠性传输 面试题引入 面试题剖析 RabbitMQ Kafka 面试题引入 如何保证消息的可靠性传输?其实就是在问你,如何保证消息不丢失。用消息有个基本原则,就是数据不能多一条,也不能少一条,不能多,就是前文说的重复消费和幂等性问题。不能少,就是说这数据别搞丢了。那这个问题你必须得考虑一下。 面试题剖析 数据的丢失问题,可能出现在生产者、MQ、消费者中,我们从 RabbitMQ 和 Kafka 分别来分析一下吧。 RabbitMQ 生产者弄丢了数据   生产者将数据发送到 RabbitMQ 的时候,可能数据就在半路给搞丢了,因为网络问题什么的,都有可能。   此时可以选择用 RabbitMQ 提供的事务功能,就是生产者发送数据之前开启 RabbitMQ 事务channel.txSelect,然后发送消息,如果消息没有成功被 RabbitMQ 接收到,那么生产者会收到异常报错,此时就可以回滚事务channel.txRollback,然后重试发送消息;如果收到了消息,那么可以提交事务channel.txCommit。 // 开启事务 channel . txSelect try { // 这里发送消息 } catch ( Exception e ) { channel . txRollback // 这里再次重发这条消息 } // 提交事务 channel .

浅析Android 消息机制

旧时模样 提交于 2019-12-03 06:38:16
浅析Android 消息机制 转载: https://www.jianshu.com/p/b6f4e84d53de 消息机制存在的意义 为什么不能在非UI线程中操作UI控件? 因为Android的UI控件不是线程安全的,如果在多线程中并发访问可能会导致UI控件处于不可预期的状态, 为什么不对UI控件加上锁机制? 首先加上锁会让UI访问的逻辑变得复杂;其次锁机制会降低UI访问的效率,因为锁机制会阻塞某些线程的执行 Android是在哪儿校验UI操作是否是在UI线程? //ViewRootImpl.java public ViewRootImpl(Context context, Display display) { ... ... mThread = Thread.currentThread(); ... ... } //该方法会多个方法的开头被调用,例如requestLayout()、invalidateChildInParent()等等... ... void checkThread() { if (mThread != Thread.currentThread()) { throw new CalledFromWrongThreadException("Only the original thread that created a view hierarchy can