Maxisvest的博客

技术 生活 原创


  • 首页

  • 标签

  • 分类

  • 归档

  • 搜索

关于项目中线程池治理的实践

发表于 2022-07-11 | 分类于 实践 阅读次数:

前言

实际项目中使用线程池的场景往往很多,比如批量刷数据,批量获取数据等用来提升接口或代码运行速度,亦或是通过提交异步任务来让某些不是特别需要实效性的任务异步执行,减少当前主线程的运行时间,而jdk也给我们提供了Executors类来支持我们很方便的创建和使用线程池,spring也封装了线程池加强使用体验。

但是在项目中,我们更多的是能看到各式各样的线程池使用情况,有自己创造的,也有直接使用公共的(例如CompletableFuture),这些在使用上完全没有问题,但是有如下几个弊端:

  • 1.线程池容易在配置上踩坑,比如线程池的队列打满后,才会触发线程池新创建线程,如果使用的是无界队列,那么其实最大线程数的参数(maximumSize)就失效了
  • 2.部分版本的线程池有bug,比如java8中的Executors.newSingleThreadExecutor()就会出现提前GC被关闭的问题(详见这里),而代码中大家经常又会复制粘贴某些代码,就导致有问题的代码会污染项目
  • 3.在项目变得庞大起来后,过多的线程池,导致线程数量剧增,频繁切换线程导致对系统资源的消耗,其实过多的线程并不能够带来更多的性能上的提升,cpu一共就固定的几个核心,也就是说他最多并行执行的线程也就是固定的数量,而且除开项目中我们可以把控的线程数之外,第三方依赖和系统进程都会有线程使用cpu,所以对于线程数的设计,需要针对项目去分析
  • 4.往往不知道如何配置线程池的参数,也往往不知道线程池的利用率是怎么样的,上线后不知道效果如何
  • 5.线程池往往没法直接继承父线程的上下文,对于需要使用traceId等跟踪的情况下,会比较麻烦

我们需要提出一个解决方案,来解决上述的问题,在我们公司实际项目探索中,发现我们使用线程池的方式多种多样,如下图

阅读全文 »

一种可以整合spring IoC机制的可插拔部署的技术思路

发表于 2022-06-02 | 分类于 java 阅读次数:

问题

对于一些需要在多方部署,代码大部分相同,但是只有部分逻辑或者业务不同的系统(比如一些管理系统需要根据当地法规或者标书中的要求去做一些改动适配),在以往实践中,基本会有两种管理方式
1.创建多个项目,其中会有冗余代码
2.在单个项目中,编写多个核心逻辑,部署时,在配置文件选择走哪个逻辑
对于这两种方案来说,都会产生冗余的代码,可扩展性和管理性都会受限,牵一发可能会动全身

思路

目前基于spring提供的可扩展接口来说,有一种实现方式可以比较好的来规避这些问题
核心的思路是只有一个框架服务,而核心代码从中

阅读全文 »

我们公司为什么从Mysql切换成TiDB

发表于 2022-05-07 | 分类于 杂谈 阅读次数:

我们为什么要换TiDB

在业务增长的情况下,伴随的是数据量的剧增,在传统Mysql的服务体系下,千万甚至上亿的数据对于数据存储和查询来说,似乎只有通过增加Mysql实例 ,分库分表等措施来应对,通常这些操作对于研发和运维来说都是很痛苦的,并且在做数据同步时更是需要小心翼翼

但此时另一端的TiDB应运而生,他的优点在于:
1.天生就是分布式的数据库,可以无限扩展,不用在考虑分库分表
2.对于大数据友好,支持Spark对主库进行实时查询
3.可以做到故障自动恢复
4.从Mysql切换至TiDB的成本对于研发来说非常小,TiDB支持Mysql的语法(比较严格,某些Mysql的特别语法TiDB并不会通过),并且使用kv结构模拟了关系型结构

TiDB的架构是怎样的

阅读全文 »

github pages + gitalk自动化部署与初始化

发表于 2022-04-25 | 分类于 教程 阅读次数:

要达到的效果

github pages是一个github提供的一种免费的静态页面管理服务,可以把页面托管给github并自动分配一个域名,也可以配置自定义的域名给这个页面管理服务
博客源码方面我使用的是hexo + next theme的一套组合,我们现在想要达到的效果是当hexo的页面源码推送完成后,让github自动帮我们编译页面文件,并且推送至仓库,然后部署静态页面服务,最后初始化文章gitalk评论区
总体流程是源码仓库收到推送,触发github actions脚本执行,首先检出代码,安装hexo环境,触发hexo deploy推送编译好的页面至页面仓库,页面收到推送后会自动触发github pages的部署脚本,进行网页部署,与此同时,源码仓库的第二部分python脚本开始运行,拉取源码中sitemap部分,获取最新的文章调用github api在文章仓库创建issue

关于仓库配置

关于这块源码的话,我会在账号底下新建一个私有化仓库,用来保存源码和配置,hexo编译好的页面我会放置在另一个公开的仓库,并配置github pages服务,里面仅仅包含编译好的页面以及对应文章的issue(也就是文章评论区),过去我是用hexo deploy命令进行仓库部署,现在这块会放到自动化里去做,我们后面去讲

关于源码中SEO、域名解析、以及readme部分

hexo deploy命令在将项目推送至仓库的时候,是会全量把编译好的项目覆盖推送至仓库,所以需要注意以下几点
通常不同搜索引擎会提供不同的SEO验证方式,如果你使用的是文件验证方式,那么你需要把你的验证文件放到源码根目录的的source文件夹下,这样会让搜索引擎在定期搜索的时候不会将你的网站标记为失效网站

阅读全文 »

关于我的博客从腾讯云迁移至github以及评论插件valine切换到gitalk的一些琐事

发表于 2022-04-11 | 分类于 杂谈 阅读次数:

为什么不用腾讯云而换github了?

最初最初有搭建博客的想法时,是采用腾讯coding的服务,代码和静态页面服务coding pages都在同一个仓库,那会是通过hexo老三套命令进行渲染和发布页面,然后按照教程将自己的域名解析到coding服务上,就可以实现页面访问了
后来coding的业务似乎一直在进行变化,曾经做好的配置直接失效,需要按照coding提供的最新教程重新做配置,而且却来越复杂,到今年,腾讯直接把coding的服务入口下线了,之前的服务还是保留,但是就是没法通过coding的静态页面入口进行配置了(当然可以花钱购买他们新的静态页面服务)
所以我决定迁移到更加灵活的github上,利用github的pages功能,代码放在私有仓库,hexo deploy的页面放在公共仓库,这样可以防止敏感数据泄漏,还可以利用到gitHub的actions工作流进行自动部署,可以说是很方便了,而且github绑定自定义域名不需要购买会员(没错,说的就是你,gitee),也不需要做认证和备案(个人觉得很爽),唯一一个不好就是服务器在境外,可能会受网络影响

为什么要切换评论插件valine到gitalk?

最开始是通过valine + leancloud进行博客文章的评论功能,但是leancloud十分不稳定,最近直接域名无法解析,导致博客评论无法展示
所以本着简洁省事的原则,找了个更古老的方案,就是使用gitalk,美观又优雅,但是需要登陆github账号才可以评论,而且发表文章后需要手动进行评论初始化才能进行评论

阅读全文 »

全链路日志追踪方案及MDC代码分析

发表于 2021-06-18 | 分类于 java 阅读次数:

在分布式服务中追踪一次请求的日志是一件非常重要的事,本文提供一种利用logBack + log4j的方案来解决这个问题
最终要实现的目的是通过一个traceId,然后再ELK中找到这个traceId对应请求所有打印的日志
来,一步一步看

1.设计思路

多个系统服务同时需要依赖一套生成和读取traceId的方案,所以,我们首先需要搞一套依赖,用来管理traceId
不同服务引用后,当一个请求进入服务中,服务首先检测他有没有携带traceId,没有的话将traceId补上,并放入MDC中,该请求进入下一个服务时,将traceId携带
各个服务间打印日志使用统一的工具类进行打印,打印中从MDC中取出traceId并打印,然后由ELK搜集整理

2.生成和读取traceId的方案

生成traceId可以使用UUID来做全局唯一标识
生成的traceId放入MDC中,用来给所有打印日志的地方使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
* 获取traceId
*/
public static String getTraceId() {
//获取
String traceId = MDC.get(TRACE_ID);
//如果traceId为空,则返回默认值
return StringUtils.isBlank(traceId) ? DEFAULT_TRACE_ID : traceId;
}

/**
* 生成traceId
*/
public static String gentraceId() {
return UUID.randomUUID().toString().replaceAll("-","");
}

阅读全文 »

使用netatalk打造一款属于自己的Time-Machine在线备份服务器

发表于 2021-02-23 | 分类于 mac 阅读次数:

前言

MAC系统的Time Machine功能曾经拯救过我电脑几次,对于我这种爱折腾的人来说十分有用
但是麻烦的点在于每次需要手动备份,需要插上移动硬盘来进行备份,就很不方便,有时会忘掉
其实MAC是可以在合适的网络硬盘上进行备份的,比如部分NAS,群辉等,但是都太贵了,于是我自己买了一套路由器大小的微型服务器,配置了一块2T硬盘,配置比较一般,但是作为服务器来说够用了,
之后就可以安装centos系统并且安装netatalk和avahi来让mac备份到这台服务器上

1.下载centos7的镜像,将该镜像刻录至U盘

1
2
3
4
5
6
7
8
9
10
#命令确定U盘的路径
diskutil list
#卸载U盘(这里/dev/disk2是查到的U盘路径,一定要确认对)
diskutil unmountDisk /dev/disk2
#安装pv工具
brew install pv
#可视化刻录进度并刻录镜像
pv -cN source < 镜像路径 | sudo dd of=/dev/rdisk2 bs=4m
## 显示下面进度
source: 5.2GiB 5:11:41 [ 503KiB/s] [=====================> ] 71% ETA 2:01:56

2.安装centos7

3.连接网络

可以选择网线直连或者wifi连接,我这里使用的是wifi连接
因为我的无线网卡为高通QCA9377,似乎属于旧版网卡,所以进入系统后打开终端,输入

1
2
3
cd lib/firmware/ath10k/QCA9377/hw1.0/
sudo mv firmware-6.bin ~
sudo mv notice_ath10k_firmware-6.txt ~

阅读全文 »

camunda流程引擎简明教程

发表于 2020-08-19 | 分类于 java 阅读次数:

前言

公司项目中使用到了camunda引擎,这个技术框架在国内的文章还是比较少,于是自己在使用中先做一部分总结

首先上官网doc地址,目前已经更新到了7.13版本 https://docs.camunda.org/manual/7.13/
如果学习使用可以搭配camunda modeler这个官方的应用,用来可视化的打开和编辑流程模型文件

一般来讲,流程引擎可以使用在像流程审批,请假,以及一些需要过程性的任务上,他可以提供一种可复用,简便以及易更改的特点,所以在有上述业务需求的场景下,可以考虑使用camunda

本文选用bpmn模型

概念

camunda的起源是来自于activity,在activity开发中团队内出现了分歧,所以一部分人转移到一个新的项目中,就是camunda

在camunda中,我们首先需要定义一个流程模型,有开始节点和结束节点,中间可以增加用户任务(userTask),门(gateway)和监听器(listener)等等
这个流程模型就叫做processDefinition(流程模型定义)

阅读全文 »

如何通过arthas在运行时执行代码

发表于 2020-06-10 | 分类于 java 阅读次数:

写在前面

公司内arthas已经打在了每个容器中,推荐切换到启动java程序的用户之后使用 java -jar arthas-boot.jar 命令启动

如果启动有问题,可以尝试如下命令现场下载jar包启动

curl -O https://alibaba.github.io/arthas/arthas-boot.jar

java -jar arthas-boot.jar

更多使用方法详见arthas官方文档 https://alibaba.github.io/arthas/

推荐一篇入门级的比较通俗的博文:https://www.cnblogs.com/theRhyme/p/10659265.html

里头是最基础常用的命令,如sc、sm命令等

用法

从spring context里获取任意bean并调用其方法或查看成员变量
启动arthas并attach到进程后,执行tt命令来记录RequestMappingHandlerAdapter#invokeHandlerMethod的请求

阅读全文 »

搭建一套简单的fabric网络

发表于 2020-04-15 | 分类于 区块链 阅读次数:

公司最近需要搭建一套区块链项目进行数据存储,于是研究了下HyperLedger Fabric这个IBM开发的重量级区块链框架,这个著名的项目采用了可插拔式的模块,提供联盟链和私链的区块链解决方案

一.安装环境

安装docker和docker-compose

首先安装go语言环境,其次配置GOPATH环境变量,例如配置到/Users/admin/go

cd $GOPATH
然后创建目录src/github.com/hyperledger/,注意必须是创建这样的目录
然后从github上clone一下fabric的源码,切换到1.4.6分支
进入scripts目录,运行bootstrap.sh,拉取所需镜像
这样基本的环境变量就搭好了

进入到fabric目录下,使用
make configtxgen
make cryptogen
生成之后可能需要的工具configtxgen、cryptogen,会生成到/build/bin下

阅读全文 »
12…5
小于同学

小于同学

技术 生活 原创

50 日志
14 分类
35 标签
E-Mail
© 2016 – 2022 小于同学
总访客量 合计阅读数