异步队列

Kafka 异步消息也会阻塞?记一次 Dubbo 频繁超时排查过程

Deadly 提交于 2019-11-30 19:37:43
线上某服务 A 调用服务 B 接口完成一次交易,一次晚上的生产变更之后,系统监控发现服务 B 接口频繁超时,后续甚至返回线程池耗尽错误 Thread pool is EXHAUSTED 。因为服务 B 依赖外部接口,刚开始误以为外部接口延时导致,所以临时增加服务 B dubbo 线程池线程数量。配置变更之后,重启服务,服务恢复正常。一段时间之后,服务 B 再次返回线程池耗尽错误。这次深入排查问题之后,才发现 Kafka 异步发送消息阻塞了 dubbo 线程,从而导致调用超时。 一、问题分析 Dubbo 2.6.5,Kafak maven 0.8.0-beta1 服务 A 调用服务 B,收到如下错误: 2019-08-30 09:14:52,311 WARN method [%f [DUBBO] Thread pool is EXHAUSTED! Thread Name: DubboServerHandler-xxxx, Pool Size: 1000 (active: 1000, core: 1000, max: 1000, largest: 1000), Task: 6491 (completed: 5491), Executor status:(isShutdown:false, isTerminated:false, isTerminating:false), in

【iOS】Swift4.0 GCD的使用笔记

元气小坏坏 提交于 2019-11-30 17:49:43
https://www.jianshu.com/p/47e45367e524 前言 在Swift4.0版本中GCD的常用方法还是有比较大的改动,这里做个简单的整理汇总。 GCD的队列 队列是一种遵循先进先出(FIFO)原则的数据结构,是一种特殊的线性表。 主队列 全局队列 串行队列 并行队列 同步 X 并行同步 串行同步 并行同步 异步 串行异步 并行异步 串行异步 并行异步 X 表示禁止这么使用,—— 表示不建议这么使用。 1. 主队列 主队列默认是串行的,另外主队列不能结合同步函数( sync )使用,会造成线程死锁。 override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. let mainQueue = DispatchQueue.main mainQueue.sync { print("造成当前线程:\(Thread.current)死锁") } } 同时主队列中不应该添加耗时的任务,因为系统的UI相关事务都是在主线程队列中完成的,大量大耗时操作可能会造成卡顿,应该避免。 主队列最常用的方法是当子线程需要通知主线程做一些UI上面的操作时,结合子线程使用: let queue =

同步与异步的区别

夙愿已清 提交于 2019-11-30 13:36:55
背景 :当多个线程需要访问同一个资源时,需要某种顺序来确保该资源在某一时刻只能被一个线程使用,否则后果不可预料。这个时候需要对数据进行同步。同步机制能够保证资源的安全性。 同步 :实现 同步操作 ,需要获得每一个线程对象的锁,这样能确保在同一时刻只有一个线程能够进入临界区(互斥资源的代码块),其他线程需要等这个线程退出临界区,锁才能释放,等待队列中其他优先级高的线程才能获得该锁,从而进入临界区。(使用synchronize关键字来实现同步,但是会有很大的资源开销甚至出现死锁)。 实现同步操作的方法有两种:①利用同步代码块;②利用同步方法。 异步 :在进程输入输出处理时,不必关心其他线程的状态或行为,也不必等待输入输出处理完毕才返回,这个时候可以进行异步编程,能够提高程序的效率。 来源: https://my.oschina.net/u/4143249/blog/3111583

【JS】js中同步异步,Promise,Async/await, Observable

穿精又带淫゛_ 提交于 2019-11-30 11:05:48
同步与异步 由于js是用来控制DOM的,所以js必须是单线程的,因为如果多个线程同时控制DOM操作,那么页面必然就乱套了。为了避免复杂性,所以它是单线程的。 为了利用多核CPU的计算能力,HTML5提出Web Worker标准,允许JavaScript脚本创建多个线程,但是子线程完全受主线程控制,且不得操作DOM。 虽然js单线程的,但是浏览器内部不是单线程的,以此js才实现了异步。一些I/O操作、定时器的计时和事件监听(click, keydown…)等都是由浏览器提供的其他线程来完成的。 单线程的js执行任务的时候必须一个个来,任务过多就需要排队了,但是如果某个任务需要时间过长,一直等下去也不是个事,那么就有了 任务队列 ,js将任务划分为 同步任务和异步任务 ,同步任务是在主进程中,等前一个任务执行完毕,再执行的任务,如:立即执行、不耗时的任务,如变量和函数的初始化、事件的绑定等等那些不需要回调函数的操作。异步任务即,不会直接在主进程中执行,而是先进入任务队列,等待主进程中任务执行完毕再执行,如用户的点击事件、浏览器收到服务的响应和setTimeout插入的事件。 异步运行的 过程如下: (1)所有同步任务都在主线程上执行,形成一个 执行栈 (execution context stack)。 (2)主线程之外,还存在一个"任务队列"(task queue)

python之路——进程

情到浓时终转凉″ 提交于 2019-11-30 07:35:22
python之路——进程 阅读目录 理论知识 操作系统背景知识 什么是进程 进程调度 进程的并发与并行 同步\异步\阻塞\非阻塞 进程的创建与结束 在python程序中的进程操作 multiprocess模块 进程的创建和multiprocess.Process 进程同步控制 —— 锁 进程间通信 —— 队列 进程间的数据共享 —— multiprocess.Manager] 进程池和multiprocess.Pool 理论知识 操作系统背景知识 顾名思义,进程即正在执行的一个过程。进程是对正在运行程序的一个抽象。 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一。操作系统的其他所有内容都是围绕进程的概念展开的。 所以想要真正了解进程,必须事先了解操作系统,点击进入 PS:即使可以利用的cpu只有一个(早期的计算机确实如此),也能保证支持(伪)并发的能力。将一个单独的cpu变成多个虚拟的cpu(多道技术:时间多路复用和空间多路复用+硬件上支持隔离),没有进程的抽象,现代计算机将不复存在。 必备的理论基础: #一 操作系统的作用: 1:隐藏丑陋复杂的硬件接口,提供良好的抽象接口 2:管理、调度进程,并且将多个进程对硬件的竞争变得有序 #二 多道技术: 1.产生背景:针对单核,实现并发 ps: 现在的主机一般是多核

Spring Cloud异步场景分布式事务怎样做?试试RocketMQ

你离开我真会死。 提交于 2019-11-30 07:09:30
一、背景 在微服务架构中,我们常常使用异步化的手段来提升系统的 吞吐量 和 解耦 上下游,而构建异步架构最常用的手段就是使用 消息队列(MQ) ,那异步架构怎样才能实现数据一致性呢?本文主要介绍如何使用 RocketMQ 的 事务消息 来解决一致性问题。 RocketMQ 是阿里巴巴开源的分布式消息中间件,目前已成为 Apache 的顶级项目。历经多次天猫双十一海量消息考验,具有高性能、低延时和高可靠等特性 PS :同步场景怎样保证一致性?请看文章《 Spring Cloud同步场景分布式事务怎样做?试试Seata 》 二、MQ选型 可以看到在 业务处理 方面来说 RocketMQ 优于其他对手,而且原生支持 事务消息 PS :业务系统用的是其他 MQ 产品但是又需要 事务消息 怎么办?学习原理自己开发实现! 三、什么是事务消息 例如下图的场景:生成订单记录 -> MQ -> 增加积分 我们是应该先 创建订单记录 ,还是先 发送MQ消息 呢? 先发送MQ消息 :这个明显是不行的,因为如果消息发送成功,而订单创建失败的话是没办法把消息收回来的 先创建订单记录 :如果订单创建成功后MQ消息发送失败 抛出异常 ,因为两个操作都在本地事务中所以订单数据是可以 回滚 的 上面的 方式二 看似没问题,但是 网络是不可靠的 !如果 MQ 的响应因为网络原因没有收到

odoo开发笔记 -- 借助模块queue_job实现异步方法调用

柔情痞子 提交于 2019-11-30 00:01:58
场景描述: 对比了几个定时调度的框架,发现各有优缺点; celery 很强,异步定时调度,异步周期调度,也有延时调度的功能,但是样例比较少,遂暂时放弃使用。 queue_job ,一个odoo第三方应用模块,同样功能强大,可以满足日常的异步方法执行; 模块github地址: https://github.com/OCA/queue/tree/10.0/queue_job 但是我们的场景稍微有些不同,就是需要在异步调用的基础上增加一个延时(例5秒); 一般的异步调度机制:异步执行避免了任务的阻塞,如果没有延时调用执行的需求,那么相当于将需要异步执行的任务,添加到了一个待执行的队列中,然后交给后台程序去慢慢处理, 处理的速度及性能,取决于服务器的硬件配置以及给相应任务指定的进程数量。 回到我们的需求,通过分析queue_job模块的代码,大概找到我们需要定制修改的位置,即:在job开始执行前增加一个延时,下图为未修改之前: 修改后代码: 注意:这样虽然可以满足需求,但是会有新的问题,造成系统走到这里需要等待5秒时间, 实际生产环境,修改后,需要观察性能,如果处理效率满足不了实际情况,可以考虑适当增加服务器CPU配置,以及配置文件中的worker数,即多开辟进程。 来源: https://www.cnblogs.com/hellojesson/p/11541057.html

python之路——进程

流过昼夜 提交于 2019-11-29 21:33:31
阅读目录 理论知识 操作系统背景知识 什么是进程 进程调度 进程的并发与并行 同步\异步\阻塞\非阻塞 进程的创建与结束 在python程序中的进程操作 multiprocess模块 进程的创建和multiprocess.Process 进程同步控制 —— 锁 进程间通信 —— 队列 进程间的数据共享 —— multiprocess.Manager 进程池和multiprocess.Pool 回到顶部 理论知识 操作系统背景知识 回到顶部 顾名思义,进程即正在执行的一个过程。进程是对正在运行程序的一个抽象。 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一。操作系统的其他所有内容都是围绕进程的概念展开的。 所以想要真正了解进程,必须事先了解操作系统, 点击进入 PS:即使可以利用的cpu只有一个(早期的计算机确实如此),也能保证支持(伪)并发的能力。将一个单独的cpu变成多个虚拟的cpu(多道技术:时间多路复用和空间多路复用+硬件上支持隔离),没有进程的抽象,现代计算机将不复存在。 必备的理论基础: #一 操作系统的作用: 1:隐藏丑陋复杂的硬件接口,提供良好的抽象接口 2:管理、调度进程,并且将多个进程对硬件的竞争变得有序 #二 多道技术: 1.产生背景:针对单核,实现并发 ps: 现在的主机一般是多核,那么每个核都会利用多道技术

并发 多线程 异步 并行

被刻印的时光 ゝ 提交于 2019-11-29 18:35:40
一 基本概念: 并发: 同时处理多件事情,在处理第一个请求时同时响应第二个请求; 同步: 同步就是顺序执行,执行完一个再执行下一个,需要等待、协调运行, 同步 调用在继续之前等待响应或返回值。如果不允许调用继续,就说调用被 阻塞 了 异步: 并发的一种形式,(1)它采用回调机制,避免产生不必要的线程。(2)多线程也可以成为实现程序异步的一种方式,在这里 异步和多线程并不是一个同等关系,异步是最终目的,多线程只是我们实现异步的一种手段(这违反了异步操作的本质) 多线程 :并发的另一种形式,它采用多个线程来执行程序。对多个线程的管理使用了线程池。 并行处理: 把正在执行的大量任务,分割成小块分配个多个运行的线程,线程池是存放任务的队列,这个队列能根据需要自行调整。由此产生了并行处理这个概念,多线程的一种,而多线程是并发的一种 二 多线程和异步对比: 多线程和异步操作两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性 线程的本质: 线程不是一个计算机硬件的功能,而是操作系统提供的一种逻辑功能,线程本质上是进程中一段并发运行的代码,所以线程需要操作系统投入CPU资源来运行和调度 异步操作的本质: 所有的程序最终都会由计算机硬件来执行,所以为了更好的理解异步操作的本质,我们有必要了解一下它的硬件基础。 熟悉电脑硬件的朋友肯定对DMA这个词不陌生,硬盘

懒惰删除和redis中的特殊线程

 ̄綄美尐妖づ 提交于 2019-11-29 18:23:09
懒惰删除和redis中的特殊线程 懒惰删除 删除key的指令是del,如果key非常大,这个指令就会卡顿,此时可以用unlink,它会将删除丢给后台进程异步回收内存,在执行的一瞬间,其他客户端就无法访问到该key了。(如果key很小就会立刻删除) 删除任务会塞进异步任务队列(主线程操作这个队列时会有加锁和解锁操作,如果异步线程在休眠的话还会唤醒),后台线程会依次处理这些任务。 异步清空数据库 flushdb和flushall命令用来清空数据库,但是也很耗时,可以用async来代替异步删除。 AOF刷磁盘 在进行AOF时,将内存中的数据刷新到磁盘的sync函数也是很耗时的,会导致主线程效率下降,所以redis也会使用一个异步线程来操作这个过程,它也有一个属于自己的任务队列。 其他异步操作 还有很多的删除:淘汰时、过期时、rename时这些都可以通过配置来异步完成。 异步删除方案在最初设计时并没有考虑到,是后来才改造的,因为redis的对象共享机制,导致懒惰删除不干净,为了支持懒惰删除,redis将这种机制抛弃,改用了无共享设计。 其他异步操作:主从同步的增量同步 来源: https://www.cnblogs.com/shizhuoping/p/11525900.html