Entry

任意时间延时消息原理讲解:设计与实现

点点圈 提交于 2020-08-05 00:59:33
场景 延时消息即消息发送后并不立即对消费者可见,而是在用户指定的时间投递给消费者。比如我们现在发送一条延时1分钟的消息,消息发送后立即发送给服务器,但是服务器在1分钟后才将该消息交给消费者。 这种延时消息有一些什么应用场景呢?比如在电商网站上我们购物的时候,下单后我们没有立即支付,这个时候界面上往往会提醒你如果xx分钟还未支付订单将被取消。对于这么一个功能如果不使用延时消息,那我们就需要使用类似定时任务的功能,比如每分钟我们跑一个定时任务对订单表进行扫描,将未支付订单扫出,如果从下单时间到现在已经超过了45分钟则将该订单取消。但是定时扫描有一个问题是效率不高,如果订单很多将会严重的影响db的性能。如果使用延时消息就没有这样的问题了,只需要发送一条延时xx分钟的的延时消息即可,在消息里携带有订单号,xx分钟后消费者收到该消息检查对应订单状态做出对应处理,这种方式将大大减轻对db的压力,实现起来也更优雅。 上面描述的是一种延时时间固定的场景,还有一些是要指定时间执行。比如买了一张一周后北京去东京的机票,那么在乘机时间到来之前可能要发送数次提醒的短信给用户,那么我们也可以在用户下单后发送一条延时消息,延时到乘机时间之前发送。 需求 有了场景,我们首先来分析一下需求: 延时时间是不固定的,比如我们无法预测用户订未来多久的机票,所以我们不能仅仅提供几种不同延时单位的延时功能。

如何在Android上显示警报对话框?

為{幸葍}努か 提交于 2020-08-05 00:01:11
问题: I want to display a dialog/popup window with a message to the user that shows "Are you sure you want to delete this entry?" 我想显示一个对话框/弹出窗口,并向用户显示“您确定要删除此条目吗?”的消息。 with one button that says 'Delete'. 一个带有“删除”按钮。 When Delete is touched, it should delete that entry, otherwise nothing. 触摸 Delete ,它应删除该条目,否则不删除任何条目。 I have written a click listener for those buttons, but how do I invoke a dialog or popup and its functionality? 我已经为这些按钮编写了一个单击侦听器,但是如何调用对话框或弹出窗口及其功能? 解决方案: 参考一: https://stackoom.com/question/8sP8/如何在Android上显示警报对话框 参考二: https://oldbug.net/q/8sP8/How-do-I-display-an-alert-dialog-on

java并发编程基础

[亡魂溺海] 提交于 2020-08-04 23:21:00
内容简介 本文比较长,主要介绍 线程的基本概念和意义、多线程程序开发需要注意的问题、创建线程的方式、线程同步、线程通信、线程的生命周期、原子类等内容。 这些内容基本都是来自《java并发编程艺术》一书,在此感谢,我是在微信读书免费看的,所以算是白嫖了。部分源码的解读是笔者自己从jdk源码扒下来的。 线程的定义与意义 线程的定义 是轻量级的进程,线程的创建和切换成本比进程低 同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等 是操作系统能够进行运算调度的最小单位 java程序至少有一个线程main,main线程由JVM创建 为什么要有多线程 可以充分利用多处理器核心 更快的响应时间,可以将数据一致性要求不强的工作交给别的线程做 更好的编程模型,例如可以使用生产者消费者模型进行解耦 并发编程需要注意的问题 上下文切换 cpu通过时间分片来执行任务,多个线程在cpu上争抢时间片执行,线程切换需要保存一些状态,再次切换回去需要恢复状态,此为上下文切换成本。 因此 并不是线程越多越快 ,频繁的切换会损失性能 减少上下文切换的方法: 无锁并发编程:例如把一堆数据分为几块,交给不同线程执行,避免用锁 使用CAS:用自旋不用锁可以减少线程竞争切换,但是可能会更加耗cpu 使用最少的线程 使用协程:在一个线程里执行多个任务 死锁 死锁就是线程之间因争夺资源,

Android Camera HAL3中预览preview模式下的控制流

对着背影说爱祢 提交于 2020-08-04 22:40:53
文均属自己阅读源码的点滴总结,转账请注明出处谢谢。 欢迎和大家交流。qq:1037701636 email:gzzaigcn2009@163.com Software:系统源码Android5.1 Camera3研读前沿: 当初在研读Camera1.0相关的内容时,主要围绕着CameraClient、CameraHardwareInterface等方面进行工作的开展,无论是数据流还是控制流看起来都很简单、明了,一系列的流程化操作使得整个框架学起来特别的容易。因为没有Camera2.0相关的基础,所以这次直接看3.0相关的源码时,显得十分的吃紧,再加上底层高通HAL3.0实现的过程也是相当的复杂,都给整个研读过程带来了很多的困难。可以说,自身目前对Camera3.0框架的熟悉度也大概只有70%左右,希望通过总结来进一步梳理他的工作原理与整个框架,并进一步熟悉与加深理解。 1.Camera3下的整体架构图。 整个CameraService建立起一个可用操作底层Camera device大致需要经过Camera2Client、Camera3Device以及HAL层的camera3_device_t三个部分。 从上图中可以发现Camera3架构看上去明显比camera1来的复杂,但他更加的模块化。对比起Android4.2.2 Camer系统架构图(HAL和回调处理

【微服务】服务网关 Zuul 工作原理源码解析

烈酒焚心 提交于 2020-08-04 17:58:40
zuul 服务网关工作原理 1. zuul 基础概念 1.1 zuul 自动化配置:ZuulServerAutoConfiguration // Zuul 空指处理器,处理所有非默认/zuul路径请求 @Bean public ZuulController zuulController() { return new ZuulController(); } // Zuul 请求映射器: 绑定请求路径与处理器关系(Springmvc 标准组件) @Bean public ZuulHandlerMapping zuulHandlerMapping(RouteLocator routes, ZuulController zuulController) { ZuulHandlerMapping mapping = new ZuulHandlerMapping(routes, zuulController); mapping.setErrorController(this.errorController); mapping.setCorsConfigurations(getCorsConfigurations()); return mapping; } // 注入ZuulServlet,负责zuul业务实际处理, 默认注入 @Bean @ConditionalOnMissingBean

RocketMQ学习教程:08.消费者Rebalance机制「云图智联」

对着背影说爱祢 提交于 2020-08-04 17:49:31
本文深入的分析了RocketMQ的Rebalance机制,主要包括以下内容: Rebalance必要的元数据信息的维护 Broker协调通知机制; 消费者/启动/运行时/停止时Rebalance触发时机 单个Topic的Rebalance流程 分区分配策略 RocketMQ与Kafka Rebalance机制的区别, 文章篇幅较长,感兴趣的用户可以先收藏,再阅读。 1 Rebalance简介 Rebalance(再均衡)机制指的是:将一个Topic下的多个队列(或称之为分区),在同一个消费者组(consumer group)下的多个消费者实例(consumer instance)之间进行重新分配。 Rebalance机制本意是为了提升消息的并行处理能力。例如,一个Topic下5个队列,在只有1个消费者的情况下,那么这个消费者将负责处理这5个队列的消息。如果此时我们增加一个消费者,那么可以给其中一个消费者分配2个队列,给另一个分配3个队列,从而提升消息的并行处理能力。如下图: 但是Rebalance机制也存在明显的限制与危害。 Rebalance限制:由于一个队列最多分配给一个消费者,因此当某个消费者组下的消费者实例数量大于队列的数量时,多余的消费者实例将分配不到任何队列。 Rebalance危害: 除了以上限制,更加严重的是,在发生Rebalance时,存在着一些危害,如下所述:

Java中Map接口的常用方法有哪些

霸气de小男生 提交于 2020-08-04 17:47:59
关于Map接口中常用的方法: 1.Map接口和Collection接口没有继承关系。 2.Map集合以key和value(键值对)的方式存储数据。 key和value都是引用数据类型,存储的都是对象的内存地址。 key起到主导的地位,value是key的一个附属品。 3.Map集合中key是唯一的,即所有键值对的key部分都不相同。 Map集合中value是可以相同的,例如:<key1, value1>,<key2, value1>。 往Map集合中添加key已经存在的新键值对,会覆盖原来的键值对。 3.Map接口中常用的方法: (1)V put(K key, V value); 向集合中添加元素。 (2)V get(Object key); 通过指定key获取value。 (3)int size(); 获取集合中元素的个数。 (4)void clear(); 清空集合,元素个数清0。 (5)boolean isEmpty(); 判断集合元素个数是否为0。 (6)boolean containsKey(Object key); 判断集合中是否包含指定key。 (7)boolean containsValue(Object value); 判断集合中是否包含指定value。 注意:contains()方法底层都调用了equals()方法,再次强调存入集合元素的类一定要重写equals

大数据篇:数据仓库案例

杀马特。学长 韩版系。学妹 提交于 2020-08-04 17:37:08
离线数据仓库 数据仓库(Data WareHouse)是为企业所有决策制定过程,提供所有系统数据支持的战略集合 通过对数据仓库中数据的分析,可以帮助企业,改进业务流程、控制、成本、提高产品质量等 数据仓库,并不是数据最终目的地,而是为数据最终的目的地做好准备:清洗、转义、分类、重组、合并、拆分、统计等等 1 项目简介 1.1 项目需求 用户行为数据采集平台搭建 业务数据采集平台搭建 数据仓库维度建模 分析:用户、流量、会员、商品、销售、地区、活动等主题 采用即席查询工具,随时进行指标分析 对集群性能进行监控,发生异常需要报警 元数据管理 质量监控 1.2 技术选型 数据采集功能如何技术选型 采集框架名称 主要功能 Sqoop 大数据平台和关系型数据库的导入导出 Datax 大数据平台和关系型数据库的导入导出 flume 擅长日志数据的采集和解析 logstash 擅长日志数据的采集和解析 maxwell 常用作实时解析mysql的binlog数据 canal 常用作实时解析mysql的binlog数据 waterDrop 数据导入导出工具 消息中间件的技术选型 开源MQ 概述 RabbitMQ LShift 用Erlang实现,支持多协议,broker架构,重量级 ZeroMQ AMQP最初设计者iMatix公司实现,轻量消息内核,无broker设计。C++实现 Kafka

Java基础理解 之 HashMap

喜欢而已 提交于 2020-08-04 16:32:00
1. Q:HashMap 实现原理 A:利用key的hashCode计算出数组的下标。存储时会出现两种情况,也就是key值相同与不相同,相同的情况下会覆盖原数据,不同时则在计算好的hashcode下标位置把值放到链表中。获取则是通过hashCode的下标,再进一步判断key是否相同,从而在链表中找到对应的值。当存储超过现有容量则扩容,可以把每个空间理解为桶,桶越多执行效率越快,以空间换时间。 源码解读: static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 static final int MAXIMUM_CAPACITY = 1 << 30; //最大容量 static final float DEFAULT_LOAD_FACTOR = 0.75f; //填充比 static final int TREEIFY_THRESHOLD = 8; //当add一个元素到某个桶,其链表长度达到8时将链表转换为红黑树 static final int UNTREEIFY_THRESHOLD = 6; static final int MIN_TREEIFY_CAPACITY = 64; transient Node<k,v>[] table; //存储元素的数组 transient Set<map.entry<k,v>>

LinkedHashMap源码分析

左心房为你撑大大i 提交于 2020-08-04 16:31:25
我们都知道HashMap是无序的Map,TreeMap是有序的Map。而LinkedHashMap继承于HashMap,也是一个有序的Map,这似乎违背了Hash的理论。(注:TreeMap和LinkedHashMap的有序性是不一样的,TreeMap的根据Key的大小来排序的,而LinkedHashMap是根据put的先后顺序来排序的) 我们来看这么一个例子 public class LinkedHashMapTest { public static void main (String[] args) { Map<String , String> test = new HashMap<>() ; test.put( "化学" , "93" ) ; test.put( "数学" , "98" ) ; test.put( "生物" , "92" ) ; test.put( "英语" , "97" ) ; test.put( "物理" , "94" ) ; test.put( "历史" , "96" ) ; test.put( "语文" , "99" ) ; test.put( "地理" , "95" ) ; test.entrySet().stream().forEach(entry -> System. out .println(entry.getKey() + ":" +