geek

并发编程之限流算法

计数限流 最简单的限流算法就是计数限流了,例如系统能同时处理100个请求,保存一个计数器,处理了一个请求,计数器加一,一个请求处理完毕之后计数器减一。 每次请求来的时候看看计数器的值,如果超过阈值便拒绝处理。 非常的简单粗暴,计数器的值要是存内存中就算单机限流算法。存中心存储里,例如 Redis 中,集群机器访问就算分布式限流算法。 优点就是:简单粗暴,单机在 Java 中可用 Atomic 等原子类、分布式就 Redis incr。 缺点就是:假设我们允许的阈值是1万,此时计数器的值为0, 当1万个请求在前1秒内一股脑儿的都涌进来,这突发的流量可是顶不住的。缓缓的增加处理和一下子涌入对于程序来说是不一样的。 固定窗口限流算法

  • 凯文
4 min read
geek

并发设计模式

Immutability模式:如何利用不变性解决并发问题? Copy-on-Write模式:不是延时策略的COW 线程本地存储模式:没有共享,就没有伤害 Guarded Suspension模式:等待唤醒机制的规范实现 Balking模式:再谈线程安全的单例模式 Thread-Per-Message模式:最简单实用的分工方法 Worker Thread模式:如何避免重复创建线程? 两阶段终止模式:如何优雅地终止线程? 生产者-消费者模式:用流水线思想提高效率 Immutability模式:如何利用不变性解决并发问题? 利用 Immutability 模式解决并发问题,也许你觉得有点陌生,其实你天天都在享受它的战果。Java 语言里面的 String 和 Long、

  • 凯文
15 min read
linux

virtualbox 网络

静态ip 在通过virtaulbox搭建虚拟机时,网络配置是绕不开的功能,我们可选择NAT,即配置一个全局的NAT网络,在虚拟节node上选择NAT并配置全局的NAT网络配置,有时当启动node后,节点上无ip,这时可手动修改网络配置 # vi /etc/sysconfig/network-scripts/ifcfg-enp0s3 BOOTPROTO 的值修改为 static (设置静态 IP 模式) ONBOOT 的值修改为 yes (开机自启动) 添加 IP,GATEWAY,NETMASK,DNS 等信息 IP gateway等信息需要与全局的Nat网络对应 然后执行service

  • 凯文
1 min read
mysql

mysql Communications link failure

原因 mysql连接错误 复现 启动服务 请求接口,调用mysql获取数据 stop mysql 请求接口报错 启动mysql 请求接口,未自动恢复,仍报错Communications link failure 解决方案 使用DruidDataSource使用com.mysql.jdbc.Driver 当创建失败时,会通过com.alibaba.druid.pool.DruidDataSource$CreateConnectionThread循环创建连接,间隔时间为timeBetweenConnectErrorMillis直到获取到正常的连接 使用DruidDataSource使用com.p6spy.engine.spy.P6SpyDriver

  • 凯文
1 min read
redis

redis库存方案

场景说明 设计秒杀活动时,因需要保证在高并发场景下库存不会超卖,或 抢券不会超量抢券的情况,可使用redis的decr功能 ,但是如果仅仅简单的使用decr,针对以下场景会有问题 剩余数量为1 线程1 decr 数量剩余0 线程2 decr 数量剩余-1 响应失败 线程1 因后续功能异常通过incr 归还数量 线程3 decr 数量剩余-1 响应失败 上述场景中,最后一个库存未使用便已不可用,在高并发场景下浪费的库存会较多,针对以上问题有以下两个方案 方案 方案1 当decr 结果小于0时,通过incr归还数量后返回失败 此方案的弊端是需要调用两次redis

  • 凯文
1 min read
技术问题总结

记录一次sim环境消费不到消息的问题

问题 在sim环境中,生产的消息已发送至中间件服务,但是无消费者进行消费 而sim环境是有对应的节点的 DD trace染色 在DD中所有的请求及mq均通过trace染色&sidecar方式实现的,该方案可解决多服务并行测试的问题 即,存在一套基准环境sim13,当某个服务上sim时,拉取一个新的环境如sim110,针对该环境的请求及mq消息trace均会染色为s110xxxx,当该服务请求其它服务时,请求该服务的基准环境,同样会染色trace,而其它服务基准环境sidecar收到请求后会判断是否存在sim110环境,如果存在,则转发;如果不存在,则转发给sim13基准环境处理请求 mq消息大概原理同上 生产段流量染色:在生产消息的时候统一通过设置消息的属性properties(map类型)值,来标记当前消息所属客户端环境 消费端环境标示:mq proxy会根据消息的客户端标识,

  • 凯文
2 min read
java

容器及java oom

容器oom 原因 当容器设置 memory limit 过小时,并且容器进程需要的memory大于 容器limit内存时,会报出容器oom,即进程可申请的内存小于系统分配给该进程的内存时oom 结果 linux内核会kill掉该进程,即容器会因为oom重启 解决方案 调大memory limit或限制进程使用内存大小 java.lang.OutOfMemoryError: Java heap space 原因 在启动java程序时,可设置堆内存大小xmx,如果该值设置的过小,导致jvm gc回收空间过小,并且堆无空间分配新的对象,即会报出java.lang.OutOfMemoryError: Java

  • 刘凯
1 min read