threadpool

使用Hystrix的插件机制,解决在使用线程隔离时,threadlocal的传递问题

爱⌒轻易说出口 提交于 2020-08-12 07:09:05
背景 在我们的项目中,比较广泛地使用了ThreadLocal,比如,在filter层,根据token,取到用户信息后,就会放到一个ThreadLocal变量中;在后续的业务处理中,就会直接从当前线程,来获取该ThreadLocal变量,然后获取到其中的用户信息,非常的方便。 但是,hystrix 这个组件一旦引入的话,如果使用线程隔离的方式,我们的业务逻辑就被分成了两部分,如下: public class SimpleHystrixCommand extends HystrixCommand<String> { private TestService testService; public SimpleHystrixCommand(TestService testService) { super(setter()); this.testService = testService; } @Override protected String run() throws Exception { .... } ... } 首先,我们定义了一个Command,这个Command,最终就会丢给hystrix的线程池中去运行。那,我们的controller层,会怎么写呢? @RequestMapping("/") public String hystrixOrder () {

解密TaurusDB存储端高并发之线程池

和自甴很熟 提交于 2020-08-12 05:08:42
摘要: 为了能加快相关任务的高效执行,TaurusDB采用多线程技术处理的方式,增加处理器单元的吞吐能力,从而提高存储端的执行效率。 1. TaurusDB背景 随着云计算进入2.0时代,数据急剧膨胀,这对实现数据库的高可靠、高性能、高吞吐的目标产生了巨大的挑战。如图1 所示,TaurusDB是华为自研的最新一代企业级具备横向扩展、海量存储能力的分布式数据库,其采用了计算存储分离,一写多读的分布式架构。将原本计算层的高密度存储相关压力下沉到存储层,极大地释放了计算层的算力。但同时将原来的存储IO转移到了网络IO,这也就是意味着,存储层将面临来自计算层风暴级的压力。如果存储层不能快速响应计算层的读写请求,会极大影响用户的使用体验。 图1 TaurusDB整体架构 图2 slice功能组件 从图2可知,TaurusDB的存储层,不单单只做存储相关的工作,也需要大量的算力,比如consolidation生成特定数据页、compation回收旧版本数据、BufferPool缓存热点数据页等任务。为了能加快这些任务的高效执行,我们首先能想到的就是能够并行执行这些任务,也就是采用多线程技术处理的方式,增加处理器单元的吞吐能力,从而提高存储端的执行效率。 2.线程池化设计思想 2.1线程为什么需要池化 首先,线程是稀缺的资源,如果频繁创建和销毁线程的开销是可观的

Spark job提交流程源代码分析

末鹿安然 提交于 2020-08-12 02:01:06
Spark job相关概念 job spark程序遇到一个action算子时就会提交一个job,一般一个spark应用程序会触发多个job。 stage 一个job通常包含一个或多个stage,每个stage里的task可以并行执行,stage的划分依据是宽依赖,当出现了宽依赖就会划分出一个新的stage。 task task是spark的基本执行单元,Task 分为ShuffleMapTask和ResultTask。 spark job提交过程主要分为两个阶段: DAGScheduler将job划分为多个stage,每个stage里的任务也叫做一个TaskSet。 TaskScheduler将每个stage(TaskSet)里的任务提交到所有的Executor上运行。 源代码分析 1.stage划分 为了追踪job提交流程,这里选择collect算子。 def collect [ U : ClassTag ] ( f : PartialFunction [ T , U ] ) : RDD [ U ] = withScope { // 调用runJob val results = sc . runJob ( this , ( iter : Iterator [ T ] ) = > iter . toArray ) Array . concat ( results : _ * ) }

elasticsearch运维实战之2

丶灬走出姿态 提交于 2020-08-11 23:26:59
elasticsearch性能调优 集群规划 独立的master节点,不存储数据, 数量不少于2 数据节点(Data Node) 查询节点(Query Node),起到负载均衡的作用 Linux系统参数配置 文件句柄 Linux中,每个进程默认打开的最大文件句柄数是1000,对于服务器进程来说,显然太小,通过修改/etc/security/limits.conf来增大打开最大句柄数 * - nofile 65535 虚拟内存设置 max_map_count定义了进程能拥有的最多内存区域 sysctl -w vm.max_map_count=262144 修改/etc/elasticsearch/elasticsearch.yml bootstrap.mlockall: true 修改/etc/security/limits.conf, 在limits.conf中添加如下内容 * soft memlock unlimited * hard memlock unlimited memlock 最大锁定内存地址空间, 要使limits.conf文件配置生效,必须要确保pam_limits.so文件被加入到启动文件中。 确保/etc/pam.d/login文件中有如下内容 session required /lib/security/pam_limits.so 验证是否生效 curl

诺禾:一行 Python代码实现并行

廉价感情. 提交于 2020-08-11 19:46:59
Python 在程序并行化方面多少有些声名狼藉。撇开技术上的问题,例如线程的实现和 GIL,我觉得错误的教学指导才是主要问题。 常见的经典 Python 多线程、多进程教程多显得偏"重"。而且往往隔靴搔痒,没有深入探讨日常工作中最有用的内容。 传统的例子 简单搜索下"Python 多线程教程",不难发现几乎所有的教程都给出涉及类和队列的例子: import os import PIL from multiprocessing import Pool from PIL import Image SIZE = (75,75) SAVE_DIRECTORY = 'thumbs' def get_image_paths(folder): return (os.path.join(folder, f) for f in os.listdir(folder) if 'jpeg' in f) def create_thumbnail(filename): im = Image.open(filename) im.thumbnail(SIZE, Image.ANTIALIAS) base, fname = os.path.split(filename) save_path = os.path.join(base, SAVE_DIRECTORY, fname) im.save(save_path)

SpringCloud- 第六篇 Hystrix参数配置(三)

核能气质少年 提交于 2020-08-11 11:11:43
1:概述 Hystrix使用Archaius作为配置属性的默认实现。官方配置文档: https://github.com/Netflix/Hystrix/wiki/Configuration 每个属性有四个优先级,依次增大: 1:代码的全局默认值 2:动态全局默认属性 可以使用全局属性文件来更改全局默认值。 3:代码实例默认 定义特定于实例的默认值,比如在HystrixCommand构造函数中设置的值 4:动态实例属性 可以动态设置实例特定的值,从而覆盖前面三个默认级别,格式是: hystrix.command.命令key.属性名称=值 2:请求上下文 1:requestCache.enabled 设置是否开启请求的缓存功能,默认true 2:requestLog.enabled 设置是否开启请求的日志功能,默认true 3:命令执行 execution.isolation.strategy 指示HystrixCommand.run()执行哪个隔离策略,选项: 1:THREAD - 它在单独的线程上执行,并发请求受线程池中线程数的限制 2:SEMAPHORE - 它在调用线程上执行,并发请求受信号计数的限制 3:官方推荐使用线程隔离策略,默认也是按照线程隔离进行处理。 4:信号量隔离的方式是限制了总的并发数,每一次请求过来,请求线程和调用依赖服务的线程是同一个线程

[经验栈]C#中几种定时器(timer)的区别

跟風遠走 提交于 2020-08-11 06:40:43
目录 1、前言 2、官方介绍 3、个人体会 System.Threading.Timer Class System.Windows.Forms.Timer Class System.Timers.Timer Class 4、后记 参考资料 1、前言 ​ 不知道你是否对.NET里面的定时器产生过一些疑问,以下是武小栈个人的一些总结。 2、官方介绍 在.NET的框架之内定时器有四种,先看一下微软官方对他们各自特点介绍: System.Timers.Timer ,它将触发事件,并定期在一个或多个事件接收器中执行代码。 类旨在用作多线程环境中基于服务器的组件或服务组件;它没有用户界面,在运行时不可见。 System.Threading.Timer ,它按固定的时间间隔对线程池线程执行单个回调方法。 回调方法是在实例化计时器时定义的,无法更改。 与 System.Timers.Timer 类一样,此类用作多线程环境中基于服务器的或服务组件;它没有用户界面,在运行时不可见。 System.Windows.Forms.Timer (仅 .NET Framework),这是一个触发事件并定期在一个或多个事件接收器中执行代码的 Windows 窗体组件。 组件没有用户界面,旨在在单线程环境中使用;它在 UI 线程上执行。 System.Web.UI.Timer (仅 .NET Framework)

没想到,这么简单的线程池用法,深藏这么多坑!

我与影子孤独终老i 提交于 2020-08-10 09:39:01
又又又踩坑了 生产有个对账系统,每天需要从渠道端下载对账文件,然后开始日终对账。这个系统已经运行了很久,前两天突然收到短信预警,没有获取渠道端对账文件。 ps:对账系统详细实现方式: 对账系统设计与实现 本以为又是渠道端搞事情,上去一排查才发现,所有下载任务都被阻塞了。再进一步排查源码,才发现自己一直用错了线程池某个方法。 由于线程创建比较昂贵,正式项目中我们都会使用线程池执行异步任务。线程池,使用池化技术保存线程对象,使用的时候直接取出来,用完归还以便使用。 虽然线程池的使用非常方法非常简单,但是越简单,越容易踩坑。细数一下,这些年来因为线程池导致生产事故也有好几起。 所以今天,小黑哥就针对线程池的话题,给大家演示一下怎么使用线程池才会踩坑。 希望大家看完,可以完美避开这些坑~ 先赞后看,养成习惯。微信搜索「 程序通事 」,关注就完事了! 慎用 Executors 组件 Java 从 JDK1.5 开始提供线程池的实现类,我们只需要在构造函数内传入相关参数,就可以创建一个线程池。 不过线程池的构造函数可以说非常复杂,就算最简单的那个构造函数,也需要传入 5 个参数。这对于新手来说,非常不方便哇。 也许 JDK 开发者也考虑到这个问题,所以 非常贴心 给我们提供一个工具类 Executors ,用来快捷创建创建线程池。 虽然这个工具类使用真的非常方便,可以少写很多代码

[C#]async和await刨根问底

余生颓废 提交于 2020-08-10 07:48:14
上一篇随笔 留下了几个问题没能解决: · 调用 IAsyncStateMachine .MoveNext方法的线程何时发起的? · lambda的执行为何先于MoveNext方法? · 后执行的MoveNext方法做了些什么事情? 那么今天就来尝试解决它们吧~ PS: 本文中部分代码来自上一篇随笔,具体来源可参考注释中的章节标题 一、 哪里来的线程 ? 通过上一篇随笔的调查我们知道了,async标记的方法的方法体会被编译到一个内部结构体的MoveNext方法中,并且也找到了MoveNext的调用者,再且也证实了有两个调用者是来自于主线程之外的同一个工作线程。 可是这一个线程是何时发起的呢?上一次调查时没能找到答案,这一次就继续从MoveNext方法开始,先找找看Task相关的操作有哪些。 1 // 三、理解await 2 bool ' <>t__doFinallyBodies ' ; 3 Exception ' <>t__ex ' ; 4 int CS$ 0 $ 0000 ; 5 TaskAwaiter< string > CS$ 0 $ 0001 ; 6 TaskAwaiter< string > CS$ 0 $ 0002 ; 7 8 try 9 { 10 ' <>t__doFinallyBodies ' = true ; 11 CS$ 0 $ 0000 = this . ' <

elasticsearch 线程与核数

☆樱花仙子☆ 提交于 2020-08-10 02:16:29
1. 背景 ES中的线程数以及核数主要体现在ES线程池使用上,见 https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-threadpool.html 2. processors 通过 GET /_nodes/os 可以查看各个节点processors分片情况 5.X版本,单个节点 allocated_processors 最多分配32核 最新的7.X版本已经没有这个限制, available_processors 和 allocated_processors 保持一致为最大可用核数 3. ES中的线程池 以thread_pool.search.size为例: 公式一:thread_pool.search.size = ( 3 * available_processors/2 ) +1 公式二:thread_pool.search. queue_size = 1000 1、只设置processors大小,ES会根据公式一计算出thread_pool.search.size,ES使用的CPU核数最大为min(系统最大核数,thread_pool.search.size) 2、只设置thread_pool.search.size大小,ES使用的CPU核数最大为min(系统最大核数,thread