- 博客(44)
- 资源 (2)
- 收藏
- 关注
原创 电商项目扣减库存场景分析
不使用强一致性的处理方案,最终一致性即可,下单减库存,成功后生成订单数据,如果此时由于超时导致库存扣成功但是返回失败,则通过定时任务检查进行数据恢复,如果本条数据执行次数超过某个限制,人工回滚。方案二:确认订单页用户有购买欲望,但是此时没有提交订单,减库存会增加很大的复杂性,而且确认订单页的功能是让用户确认信息,减库存不合理,希望大家对该方案发表一下观点,本人暂时只想到这么多。利用Redis 分布式锁,强制控制同一个商品处理请求串行化,缺点并发不高 ,处理比较慢,不适合抢购,高并发场景。
2023-06-27 19:49:28 307
原创 使用kafka的一些常见问题
生产者固定key,导致消息集中在某个partition现象: 服务端接收到的消息集中在固定partition上 原因: kafka生产端默认按照消息key来路由具体的broker机器解决: 不要指定key,如果需要保证业务上的顺序,就指定key为业务变量错误代码示例: String key = "aa"; producer.send(new ProducerRecord<>("TOIPICA",key,"这是内容")) //代码的问题在于,把消息的key硬编码了,导致消息
2022-05-27 14:00:11 832
原创 redis使用Jackson2JsonRedisSerializer序列化引起的问题
@Configurationpublic class RedisConfig { @Resource private RedisProperties redisProperties; @Value("${spring.redis.hotwheel.username}") private String redisUserName; @Bean public <K,V> RedisTemplate<K,V> redisTemplate(Lettuc.
2022-03-03 16:03:17 5361
转载 ApplicationEvent
文章出处:第二十七章:SpringBoot使用ApplicationEvent&Listener完成业务解耦 - 简书ApplicationEvent以及Listener是Spring为我们提供的一个事件监听、订阅的实现,内部实现原理是观察者设计模式,设计初衷也是为了系统业务逻辑之间的解耦,提高可扩展性以及可维护性。通过 ApplicationEvent 类和 ApplicationListener 接口来提供在 ApplicationContext 中处理事件。如果一个 bean
2022-03-02 17:12:18 1495
原创 单元测试-Mockito 接入文档
1.Mock 测试的意义在测试过程中,对于一些不容易构造(或获取)的对象(譬如第三方RPC调用、JDBC数据库调用、MQ、redis等中间件调用),需要虚拟一个对象以便测试对应的方法;Mock 最大功能就在于把单元测试的耦合分解开,如果测试的代码须对另一个类或接口有依赖,它能模拟这些依赖,并帮你验证所调用的依赖的行为。2.什么是MockitoMockito是根据MIT许可发布的Java开放源测试框架。该框架允许在自动化单元测试中创建测试双重对象(模拟对象),以达到测试驱动开发(TDD)或行.
2022-02-23 20:04:50 414
原创 对接三方网关设计
api部分hw_gateway_api表里配置每个api的第三方调用所需信息业务层(hotwheel-route)指定api_code并传参(json)调用, (token获取及加签在网关层自动完成)回调部分hotwheel-gateway的controller层暴露一个统一的入口(url格式: /**)根据实际的uri从hw_gateway_callback查询到对应的topic,把接收到的参数发往该topic并返回第三方结果(成功:code=10000)验签过程..
2022-02-22 09:07:52 715
原创 Spring注解驱动
Spring注解编程基础组件常见的配置组件@Configuration@ComponentScan@Scope@Lazy@Conditional@Import给Spring Ioc容器注入Bean 的方式(注解)1,@Bean直接导入2,@ComponentScan 包扫描, 默认扫描@Controller @Service@Repository@Component3,@Import 快速导入组件Bean a.@Import直接传参导入...
2022-02-11 10:22:03 104
原创 线程池优雅关闭
先说结论,没有完美的线程池关闭方法,因为每个人的业务不同,下面先给出个示例,业务可以在这个基础上修改下面来看下 guava 提供的线程池关闭方法,我再加些注释 // com.google.common.util.concurrent.MoreExecutors#shutdownAndAwaitTermination publicstaticbooleanshutdownAndAwaitTermination( ExecutorService service,lo...
2022-01-19 18:03:49 637
原创 死循环任务优雅关停
经常有一些任务需要一个死循环去执行,比如定时刷新缓存,调别人接口持续拉取最新数据等以下给出三种方案示例代码,仅供参考使用单例线程池(推荐) privatevolatilebooleanrunning =false; privateExecutorService executor = Executors.newSingleThreadExecutor(); publicsynchronizedvoidstart() { if(run...
2022-01-19 18:03:11 661
原创 http 服务优雅下线
我们现在大部分 http 服务上游都挂的 nginx , 因此在 scm 发布应用时,会先从 nginx 下线服务(和运维沟通了下,大部分都接入了,不确定自己应用是否接入的可以问下运维)如果是 http 直联调用,并且不经过 nginx, 下面给出一个通用的思路1、通过注册中心通知消费者自己要下线了2、主动通知消费者自己要下线了...
2022-01-19 18:01:32 2336
原创 kafka-client 优雅关停
以下给出一个参考示例,但具体的某些细节的处理还需要根据自己的业务自行抉择实现思路,通过 consumer.wakeup() 方法让 poll 方法抛出异常,然后捕获异常,退出《kafka权威指南》 第 64 页也有给出示例,有兴趣的可以找来看看 // 消费线程 privateThread consumerThread; // 线程名称,自己设置下 privateString threadName; privatevolatileboolea...
2022-01-19 17:57:32 2239
原创 DUBBO优雅停机
先说结论现在相对完美的 dubbo 优雅停机方案是 qos + dubbo 自身优雅停机qos 接入前置条件:dubbo >=2.5.8, netty 4简而言之,通过 qos 提供的接口,在停机前先调用 qos 提供的 offline 接口下线所有服务官方文档和运维同学沟通了下,现在新的 dubbo 应用默认都接入了 qos, 旧的应用如果不确定的话,可以找运维同学确认下运维接入Qos功能如果你想监听 qos offline 事件,可以配合 qos-plus 使用q...
2022-01-19 17:56:44 3250
原创 spring 优雅停机
为什么 spring 要做优雅停机我们现在的服务一般都是在 spring 容器运行,如果不做优雅停机,会有以下问题1、程序中的任务运行到一半,被强行结束,影响到正常业务2、出现 spring 容器已经关闭,但任务仍在运行的情况,这个时候用到 spring 的部分就会报错所以理想状态下,停机的时候,先停止我们自己的任务,然后再关闭 spring 的容器spring 怎么做优雅停机在用 kill pid 进行停机时,会触发 jvm 钩子函数,spring 很好的利用了这个特性,来..
2022-01-19 17:55:14 1591
原创 优雅停机的时机与任务顺序编排
优雅停机的时机1、执行 kill 前提前触发下线理想状态下,所有服务可以暴露出来的一个下线接口,我们可以通过运维的自动化脚本提前执行下线,然后等待片刻,再执行 kill pid遗憾的是,我们运维层面并没有做此规定,但有两个接口可以达到类似的效果1、dubbo 的 qos 接口2、spring boot actuator 的 shutdown 端点spring boot actuator 我们很多应用都没接入,而且有局限性,我们暂不考虑dubbo qos 接口现在大部分应用
2022-01-19 17:53:54 1808
原创 优雅停机问题
类别 文档 基础知识 优雅停机的时机与任务顺序编排 spring spring 优雅停机 dubbo dubbo优雅停机最佳实践和原理 kafka kafka-client 优雅关停 http http 服务优雅下线 死循环任务 死循环任务优雅关停 线程池 线程池优雅关闭 ...
2022-01-19 17:53:23 1111
原创 kafka zk节点
前言、Zookeeper 在 Kafka 中的作用 1、Broker注册 2、Topic注册 3、生产者负载均衡 4、消费者负载均衡 5、分区 与 消费者 的关系 6、消息 消费进度Offset 记录 7、消费者注册 一、zk节点结构 二、admin 2.1preferred_replica_election 2.1.1 结构 2.1.3 描述 2.2reassign_partitions 2.2.1结构 2.2.2 描述 ...
2022-01-19 17:41:24 1467
原创 Log4j 史诗级漏洞修复
漏洞描述Apache Log4j2某些功能存在递归解析功能,攻击者可直接构造恶意请求,触发远程代码执行漏洞。漏洞评级CVE-2021-44228 Apache Log4j 远程代码执行漏洞 严重影响版本经验证 2.15.0-rc1 版本存在绕过,实际受影响范围如下:Apache Log4j 2.x < 2.15.0-rc2问题复现代码中添加一下日志打印代码: String aaa ="${jndi:ldap://127.0.0.1:2179/calc}".
2021-12-16 13:51:07 1692 3
原创 kafka消息消费不到
以下以33环境为例基本情况broker地址:10.30.200.155:15386topic:DC_REACH_DESTINATION_EVENT_NOTIFY检查kafkahttps://test-kafka.xxxkeji.cn/clusters/test33查看是否有kafka挂了例如,kafka broker为2,正常33,44 kafka数量为3, stable为2如果数量小于既定kafka broker数说明kafka挂了,需要重启kafka.
2021-11-29 15:21:27 5097
原创 KAFKA问题排查
*遇到kafka的问题千万不要直接删除kafka-manager里的topic,会导致topic不能再使用,首先需要确认kafka是否可用*一、部署机器test33-1 test34-2 test35-3二、排查问题1、33环境不能用topic能用,tcp报错如下图(1)验证kafka是否可用开启一个生产者和消费者查看kafka是否正常,如下 路径:cd /usr/local/kafka/1/bin 生产者:sh kafka-console-prod.
2021-11-29 15:19:40 2187
原创 redis提成程序性能
并发编程--异步编程分布式消息-- 异步设计分布式存储--IO分布式架构–服务治理性能优化 jvm tomcat mysql 算法并发数量计算:tps qps rt dau mau pv1TPS 可能会有nQPS1000万用户问题分解根据需求在系统层面会有一些指标 tps qps rt dau mau pv,基于指标设计架构从一些监控工具可以得到比较重要的服务的指标, 用户数量决定了整个系统的压力 后台需要支撑多少用户的并发访...
2021-11-08 19:46:45 513
原创 线程池ThreadPool
提升并发的方式技术: 缓存 mq 线程池架构: 微服务 分布式 集群什么是线程池线程池的关键参数线程池的设计思想如何动态设计线程池参数线程使用上的问题:频繁创建、销毁-----上线文切换(消耗CPU)-----线程的复用—池化技术java中的线程池Executors提供了如下四种默认的线程池 newFixedThreadPool //固定线程数量 publicstaticExecutorSer...
2021-11-07 18:15:22 115
原创 CompleableFuture
Future/Callable java5CompletableFuture—异步编程的方法Future/Callable publicclassFutureDemo { staticclassCalculationCallableimplementsCallable<Integer> { privateintx; privateinty; publicC...
2021-11-07 14:37:56 551
原创 ThreadLocal
引入主题 publicclassThreadLocalDemo { //希望每个线程获得的num = 0 staticThreadLocal<Integer> local =newThreadLocal() { protectedInteger initialValue() { return1; } }; ...
2021-10-26 20:06:45 187
原创 JUC 并发工具
J.U.C 并发工具aqs共享锁应用1,CountDownLatch计数器倒计时方法:awaitcountdown说明:1,static CountDownLatch countDownLatch = new CountDownLatch(3) 表示控制三个线程的操作2,main线程里面调用countDownLatch.await() 阻塞 ,每次线程调用countDown() 方法 的时候,计数器-1 当计数器 = 0 时 唤醒main线程代码示例...
2021-10-07 15:55:24 103
原创 无界阻塞队列
无界阻塞队列SynchronousQueue无界阻塞队列没有存储容量的阻塞队列;通过信息的传递来实现生产者线程和消费者线程的阻塞和唤醒生产者put()元素 假如没有消费者则生产者会阻塞;消费者take()元素,假如没有生产者 消费者也会阻塞newCachedThreadPool:可以缓存的线程池 可以处理非常大的请求任务,假如有1000个任务 那么线程池需要分配1000个线程来执行 publicstaticExecutorService newCachedThreadPo...
2021-10-06 17:25:02 671
原创 Condition
Condition 是一个线程通信工具 跟锁没有关系锁 条件控制代码示例 public class ConditionDemoWait implements Runnable{ private Lock lock; private Condition condition; public ConditionDemoWait(Lock lock, Condition condition){ this.lock = lock; this.condition = condit..
2021-10-05 19:06:39 168
原创 wait/notify/join
线程通信1,共享内存2,wait/notify -> 基于某一个条件来等待或者唤醒 ,从而进行通信 可以基于wait()方法构建生产者消费者模型以上图示说明:1,两个线程必须抢占同一把锁 2,wait/notify 方法必须在synchronized方法里面wait()方法阻塞 一定会释放锁 注意此处释放锁但是不一定代表同步代码块执行结束notify() 不会释放锁 //以下代码通过Queue这一个共享数据结构 来进行生产者消费者通信 基于某一个...
2021-10-05 13:47:58 202
原创 Lock锁原理分析
猜想锁的设计猜想:1,满足线程的互斥特性2,同一时刻只能有一个线程进入到加锁的代码 ---》多线程环境下 顺序访问3,抢占到锁的标记 表示互斥全局变量4,逻辑处理 抢到锁的逻辑 没抢到锁的逻辑 需要排队(允许有N个线程被阻塞,此时线程处于活跃状态) 通过一个数据结构,存储N个排队的线程 需要等待(让处于排队中的线程,如果没有抢到锁则直先阻塞→释放CPU资源) ...
2021-10-05 10:34:33 265
原创 CPU 高 问题排查步骤
CPU 高 问题排查先找到进程里面占用CPU最高的线程,然后jstack 日志里面分析,一般会定位到具体的哪行代码curlhttp://localhost:8080/testtop -c 找出消耗CPU进程top -H -p pid 找出进程下哪个线程消耗CPUprintf "0x%x\n" pid 占用CPU最高的那个线程的pid 对应的16进制表示printf "0x%x\n" 16356 得到结果0x3fe4jstack pid | grep -A 2...
2021-09-27 13:23:54 474
原创 jedispool 为redis保驾护航
背景 一、使用方法 二、参数说明 1. 资源设置和使用 2.空闲资源监测 三、资源池大小(maxTotal)、空闲(maxIdle minIdle)设置建议 1.maxTotal:最大连接数 2. maxIdle minIdle 3.监控 四、常见问题 1.资源“不足" 2. 预热JedisPool 背景合理的JedisPool资源池参数设置能为业务使用Redis保驾护航,本文将对JedisPool的使用、资源池的参数进行详细说明,最后给出“最合理”配置。
2021-07-26 09:22:35 76
原创 redis 客户端 jedis 使用
jedis-哨兵连接 引入依赖 示例代码 spring data redis-哨兵连接 引入依赖 添加配置 示例代码 springboot-哨兵连接 引入依赖 用jedis替换letuce 更友好的序列化方式 参数调优redis 的 java 客户端 常用的有三种 jedis, lettuce, redissonjedis-哨兵连接引入依赖 <dependency> <groupId>redis.clie..
2021-07-26 09:21:49 109
原创 redis lettuce 调优
合理的参数设置可以为你的redis客户端保驾护航,下面将对lettuce使用的一些重要参数进行说明和建议 序号 参数名 含义 默认值 使用建议 序号 参数名 含义 默认值 使用建议 1 enableAllAdaptiveRefreshTriggers redis
2021-07-26 09:21:34 3168 1
原创 jvm 故障分析
0.背景 1、虚拟机内存空间的认识 2、合理的调整java 堆的大小 3.分析java线程所持有jvm内存 4.分析permGen 到metaspace 5.利用JProfiler 进行对内存泄漏的分析0.背景JVM管理了整个程序的内存分配和使用,负责对象的整个生命周期。这是大家都比较熟知的内容,但是转到项目实战中核心的JVM参数有哪些,如何根据项目评估一套合理的JVM参数,在项目上线后如何根据业务优化JVM配置,碰到GC频繁该如何分析解决等等实际问题,就基本没有章法了,若盲目上..
2021-07-26 09:21:20 214
原创 zookeeper 使用规范
重要参数说明与配置 服务端推荐配置 zk运维 zk四字命令 需要避免的事项 zk节点 Watches Data Access Ephemeral Nodes Sequence Nodes -- Unique Naming Time in ZooKeeper ZooKeeper Stat Structure session会话 zk api implementation 官方对zk性能的评估 解决zk大量连接问题-zk观察者模式 zk客户端使用代
2021-07-23 18:13:37 1290
原创 Consul vs Zookeeper vs Etcd vs Eureka
常见的服务发现框架比较 Feature Consul zookeeper etcd euerka 服务健康检查 服务状态,内存,硬盘等 (弱)长连接,keepalive 连接心跳 可配支持 多数据中心 支持 — — — kv存储服务 支持 支持 支持 — 一致性 raft paxos raft
2021-07-23 18:11:02 77
原创 分布式延迟队列的实现方案比较
1.定时轮询表优点:简单易用,可以利用quartz的分布式特性轻易的进行横向扩展。缺点:需要扫表会增加程序负荷、任务执行不够准时。2.利用jdk自带的delayQueue优点:效率高,任务触发时间延迟低。缺点:复杂度比quartz要高,自己要处理分布式横向扩展的问题,因为数据是放在内存里,需要自己写持久化的备案以达到高可用。3.利用wheelTimer:netty的HashedWheelTimer优点:效率高,根据楼主自己写的测试,在大量高负荷的任务堆积的情况下,Hash...
2021-07-23 18:09:08 1201
原创 分布式任务 调度框架对比
现在已有开源项目1、Quartzhttp://www.quartz-scheduler.org/2、spring cloud taskhttp://cloud.spring.io/spring-cloud-task/3、TBSchedulehttp://code.taobao.org/p/tbschedule/wiki/index/4、elastic-jobhttps://github.com/dangdangdotcom/elastic-job5、light-task-sch...
2021-07-23 18:08:08 778
原创 记录一次kafka topic 消费不到数据问题排查
如果数量小于既定kafka broker数说明kafka挂了,需要重启kafka kafka.1.server status #检查 kafka.1.server start #启动 如果无上述命令,执行 history|grep kafka , 查看kafka相关启动命令如果执行命令无法启动kafka,极有可能是内存不足或者磁盘不足内存不足执行top命令,看哪个应用占的比较多,能干掉的先干掉如果磁盘不足执行df -h ,看是哪个文件过大导致,清理出多余
2021-07-23 18:05:41 5334
原创 kafka消费者订阅关系获取工具
1.背景之前获取消费者订阅关系使用的是kafka本身的脚本,易用性较差,获取完数据之后需要大量的人工处理才能整理出关心数据2.工具:consumer-groups-get-utils.tar.gzsh0-run-all.sh kafka地址即可结果文件格式:successGroupConsumerYYYY-XX-XX-XX-XX-XX.txtYYYY-XX-XX-XX-XX-XX为生成结果文件的时间结果示例如下MQ_GROUP_TAXI_CONSUMER:tra.
2021-07-23 17:55:14 344
redis-可视化工具-Another.Redis.Desktop.Manager.7z
2021-10-28
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人