4. 分布式框架

2025-01-04  本文已影响0人  小周爱吃瓜

网站文章,盖楼热点.

消息丢失问题:

  1. 发送端同步和异步.

  2. 同步和异步刷盘 SYNC_FLUSH

  3. 主从复制 SYNC_MASTER

  4. 消费者端.
    手动提交消息. 处理完之后再提交位移.


    Screenshot 2024-10-26 at 18.51.19.png
  5. 消息的消费端:
    可能发多次.

  6. 唯一id. 每次操作前先select一下,再决定是否要插入.

  7. token+唯一id. 失效时间可以自己设置,也是我们项目中的. 默认是3秒。
    如果存在的话不是第一次请求,这样不会消耗后续的资源.

  8. 防重表.

  9. 版本控制. cas. mybatis-plus @version注解.

  10. 状态控制.

-Dubbo Kafka,RabbitMQ

关闭自动偏移,开始手动提交偏移.
同步+异步提交

生成->Broker->consumer
发送端重试,对于发送失败回调处理.
Broker端存储丢失: 0 ,1 ,all.
消费端:
关闭自动提交,改为手动.

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");
        }
    }
}

分布式幂等:
唯一索引,查之前新增,version乐观锁版本号,
redis+token:生成唯一token给前端,每次执行的时候带上,如果在可以执行业务,否则不处理,直接返回.
分布式锁

上一篇 下一篇

猜你喜欢

热点阅读