- Redis
Redis 6.0: 多线程,解决网络IO和数据批处理问题.
数据操作还是单线程的.
网站文章,盖楼热点.
MongoDb
ES
Sharding Sphere,MyCat
- RocketMQ
消息丢失问题:
发送端同步和异步.
同步和异步刷盘 SYNC_FLUSH
主从复制 SYNC_MASTER
-
消费者端.
手动提交消息. 处理完之后再提交位移.
Screenshot 2024-10-26 at 18.51.19.png 消息的消费端:
可能发多次.唯一id. 每次操作前先select一下,再决定是否要插入.
token+唯一id. 失效时间可以自己设置,也是我们项目中的. 默认是3秒。
如果存在的话不是第一次请求,这样不会消耗后续的资源.防重表.
版本控制. cas. mybatis-plus @version注解.
状态控制.
-Dubbo Kafka,RabbitMQ
- kafka
关闭自动偏移,开始手动提交偏移.
同步+异步提交
生成->Broker->consumer
发送端重试,对于发送失败回调处理.
Broker端存储丢失: 0 ,1 ,all.
消费端:
关闭自动提交,改为手动.
Netty
Nio,Bio,AIo
Zookeeper
ELK,Loki
ServiceMesh SideCar
skywalking
java agent. 运行时,启动时. 2种时机.
premain.
public class PreMainAgent {
public static void premain(String agentArgs, Instrumentation inst) {
//创建一个转换器,转换器可以修改类的实现
//ByteBuddy对java agent提供了转换器的实现,直接使用即可
AgentBuilder.Transformer transformer = new AgentBuilder.Transformer() {
public DynamicType.Builder<?> transform(DynamicType.Builder<?> builder, TypeDescription typeDescription, ClassLoader classLoader, JavaModule javaModule) {
return builder
// 拦截任意方法
.method(ElementMatchers.<MethodDescription>any())
// 拦截到的方法委托给TimeInterceptor
.intercept(MethodDelegation.to(MyInterceptor.class));
}
};
new AgentBuilder // Byte Buddy专门有个AgentBuilder来处理Java Agent的场景
.Default()
// 根据包名前缀拦截类
.type(ElementMatchers.nameStartsWith("com.agent"))
// 拦截到的类由transformer处理
.transform(transformer)
.installOn(inst);
}
}
方法拦截器.
public class MyInterceptor {
@RuntimeType
public static Object intercept(@Origin Method method,
@SuperCall Callable<?> callable)
throws Exception {
long start = System.currentTimeMillis();
try {
//执行原方法
return callable.call();
} finally {
//打印调用时长
System.out.println(method.getName() + ":" + (System.currentTimeMillis() - start) + "ms");
}
}
}
通过框架拿结果,而不是列举如何使用.
TIDB
分布式幂等:
唯一索引,查之前新增,version乐观锁版本号,
redis+token:生成唯一token给前端,每次执行的时候带上,如果在可以执行业务,否则不处理,直接返回.
分布式锁
