4. 分布式框架

  • Redis
    Redis 6.0: 多线程,解决网络IO和数据批处理问题.
    数据操作还是单线程的.

网站文章,盖楼热点.

  • MongoDb

  • ES

  • Sharding Sphere,MyCat

  • RocketMQ

消息丢失问题:

  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

  • 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给前端,每次执行的时候带上,如果在可以执行业务,否则不处理,直接返回.
分布式锁

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容