当前位置:首页 > 科技  > 软件

转转基于MQ的分布式重试框架设计方案

来源: 责编: 时间:2024-02-01 12:48:02 287观看
导读1 背景在分布式场景下,为了保障系统的可用性和数据的最终一致性,采用基于消息队列(MQ)的重试机制是一种常见的解决方案。伪代码如下:/** * 需要保证最终一致性的函数 */public void doSomething(Object args) { try {

1 背景

在分布式场景下,为了保障系统的可用性和数据的最终一致性,采用基于消息队列(MQ)的重试机制是一种常见的解决方案。伪代码如下:Cqv28资讯网——每日最新资讯28at.com

/** * 需要保证最终一致性的函数 */public void doSomething(Object args) {    try {      // 执行事务的操作      executeTransaction();      // 提交事务      commitTransaction();    } catch (Exception e) {        // 回滚事务        rollbackTransaction();        // 记录日志        log.error(e);        // 序列化参数        byte[] body = serialize(args);        // 构建消息, 指定Topic、Body        Message msg = new Message("doSomethingTopic", body);        // 发送失败重试消息        mq.send(msg);    }}/** * 消费者,用于失败重试处理 */@Consumer(topic = "doSomethingTopic")public void consume(Message msg) {    // 反序列化    Object args = msg.deserialize();    // 重试    doSomething(args);}

在上述示例中,我们需要编写一系列与业务无关的代码来实现业务逻辑的重试机制。为了减轻开发人员的负担并让其专注于核心业务,我们可以对这些无关代码进行抽象和优化,以提高开发效率和代码质量。Cqv28资讯网——每日最新资讯28at.com

2 方案

通过如下步骤,我们对重试逻辑进行了封装,开发人员只需要在需要保证最终一致性的函数上标注一个重试注解,便拥有基于MQ的分布式重试能力。Cqv28资讯网——每日最新资讯28at.com

1. 使用注解与AOP: 通过使用注解与面向切面编程(AOP)的技术,将重试逻辑模块与业务代码解耦。开发人员可以在需要保证最终一致性的业务方法上添加注解,通过AOP将重试逻辑应用到目标方法中,从而自动触发重试机制。Cqv28资讯网——每日最新资讯28at.com

2. 提供配置化选项:为重试逻辑提供可配置化的选项,例如设置最大重试次数、重试间隔时间等。这样,开发人员可以根据具体业务需求进行调整,而无需修改代码。Cqv28资讯网——每日最新资讯28at.com

3. 异常处理和日志记录:在重试逻辑中合理地处理异常,并在必要时记录相关日志。这样可以帮助开发人员及时发现问题并进行排查。Cqv28资讯网——每日最新资讯28at.com

4. 提供可视化监控工具:开发一个可视化的监控工具,用于实时跟踪重试操作和相关指标。这样可以帮助开发人员更好地理解重试的执行情况,并进行故障排查和性能优化。Cqv28资讯网——每日最新资讯28at.com

图片图片Cqv28资讯网——每日最新资讯28at.com

3 效果

我们引入了@MQRetry注解用于标记业务逻辑函数,一旦该函数发生异常,该注解会将服务名、类的完整名称、方法名称以及实际参数列表发送到消息队列(MQ)中。同时系统会注册一个MQ消费者来消费这些消息,并进行重试处理。Cqv28资讯网——每日最新资讯28at.com

举个例子,假设我们有一个名为doSomething的函数,它包含了需要保证最终一致性执行的业务逻辑。仅需在该函数上添加@MQRetry注解,当函数出现异常时,框架会自动发送一条MQ重试消息。这条消息可以被当前服务的任意一台服务器消费,并重新执行doSomething函数。Cqv28资讯网——每日最新资讯28at.com

@Serviceclass Service {     @MQRetry    public void doSomething(String params1, String params2, List<String> params3) {        //throw new RuntimeException(); 抛异常将重试        //RetryContext.markRetryLater(); 标记为需要下次重试         //int retryCount = RetryContext.getRetryCount(); 获取重试次数    } } @Controllerclass Controller {         @Autowired    private Service service;     service.doSomething("1", "2", Arrays.asList("3", "4"));}

4 可选项

除此之外,我们还为开发人员提供了一些可选项,提供一些可配置的能力。Cqv28资讯网——每日最新资讯28at.com

/** * 基于MQ的分布式重试组件 */@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface MQRetry {    /**     * 最大重试次数,默认与上限为16次     */    int maxAttempts() default 16;        /**     * 忽略的异常类列表,默认所有异常都重试     */    Class<? extends Throwable>[] exclude() default {};        /**     * 需要重试的异常类列表,默认所有异常都重试     */    Class<? extends Throwable>[] include() default {};        /**     * 出现异常时的处理函数, 格式: Bean名.方法名. 如: smsService.onError     * 也可以只设置函数名, 不设置Bean名将执行本类的函数. 如: onError     * 要求函数参数必须与重试函数的参数完全一致     */    String errorHandler() default "";        /**     * true: 第一次调用时, 同步执行@MQRetry函数, 如果失败再使用MQ     * false: 调用@MQRetry函数时, 只会发送MQ     */    boolean firstSyncCall() default true;        /**     * 消费线程数,默认为20个     */    int consumeThread() default 20;    }

5 注意事项

  1. 适用于异步场景,重试函数不要设置返回值,函数的返回值将不会有任何的实际意义。
  2. At lease Once保证,重试函数需要保证幂等。
  3. 使用了AOP代理实现,因此,@Transactional的注意事项同样适用于@MQRetry,如this调用、private函数、final函数会导致重试失效。
  4. 如果重试函数需要增加参数,请在函数参数最后位置添加。历史消息消费时对应参数将填充为null。

6 总结

在计算机领域中,重试机制的重要性不言而喻。它通常分为两种模式:客户端模式和服务端模式。客户端模式简单易用,但可靠性较低;而服务端模式虽然相对复杂,但能够提供更高的可靠性。Cqv28资讯网——每日最新资讯28at.com

无论是客户端模式还是服务端模式,重试机制都是保障系统正常运行的重要一环。选择适合您业务需求的模式,并通过合理的配置项进行优化,将为您的系统带来更好的表现和用户体验。Cqv28资讯网——每日最新资讯28at.com

图片图片Cqv28资讯网——每日最新资讯28at.com

关于作者Cqv28资讯网——每日最新资讯28at.com

苑冲,转转架构部存储服务负责人,负责MQ、监控系统、KV存储、时序数据库、Redis、KMS秘钥管理等基础组件。喜欢深入思考问题,对探索新领域和解决问题充满热情。Cqv28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-70413-0.html转转基于MQ的分布式重试框架设计方案

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 互动游戏团队如何将性能体验优化做到TOP级别

下一篇: 为什么 Bun 可能对 Node 降维打击?

标签:
  • 热门焦点
  • 小米官宣:2023年上半年出货量中国第一!

    今日早间,小米电视官方微博带来消息,称2023年小米电视上半年出货量达到了中国第一,同时还表示小米电视的巨屏风暴即将开始。“公布一个好消息2023年#小米电视上半年出货量中国
  • 对标苹果的灵动岛 华为带来实况窗功能

    继苹果的灵动岛之后,华为也在今天正式推出了“实况窗”功能。据今天鸿蒙OS 4.0的现场演示显示,华为的实况窗可以更高效的展现出实时通知,比如锁屏上就能看到外卖、打车、银行
  • 帅气纯真少年!日本最帅初中生选美冠军出炉

    日本第一帅哥初一生选美大赛冠军现已正式出炉,冠军是来自千叶县的宗田悠良。日本一直热衷于各种选美大赛,从&ldquo;最美JK&rdquo;起到&ldquo;最美女星&r
  • 一文看懂为苹果Vision Pro开发应用程序

    译者 | 布加迪审校 | 重楼苹果的Vision Pro是一款混合现实(MR)头戴设备。Vision Pro结合了虚拟现实(VR)和增强现实(AR)的沉浸感。其高分辨率显示屏、先进的传感器和强大的处理能力
  • JVM优化:实战OutOfMemoryError异常

    一、Java堆溢出堆内存中主要存放对象、数组等,只要不断地创建这些对象,并且保证 GC Roots 到对象之间有可达路径来避免垃 圾收集回收机制清除这些对象,当这些对象所占空间超过
  • 猿辅导与新东方的两种“归途”

    作者|卓心月 出品|零态LT(ID:LingTai_LT)如何成为一家伟大企业?答案一定是对&ldquo;势&rdquo;的把握,这其中最关键的当属对企业战略的制定,且能够站在未来看现在,即使这其中的
  • 2299元起!iQOO Pad明晚首销:性能最强天玑平板

    5月23日,iQOO如期举行了新品发布会,除了首发安卓最强旗舰处理器的iQOO Neo8系列新机外,还在发布会上推出了旗下首款平板电脑——iQOO Pad,其最大的卖点
  • AI艺术欣赏体验会在上海梅赛德斯奔驰中心音乐俱乐部上演

    光影交错的镜像世界,虚实幻化的视觉奇观,虚拟偶像与真人共同主持,这些场景都出现在2019世界人工智能大会的舞台上。8月29日至31日,“AI艺术欣赏体验会”在上海
  • 外交部:美方应停止在网络安全问题上不负责任地指责他国

      中国外交部今天(16日)举行例行记者会。会上,有记者问,美国情报官员称,他们正在阻拦来自中国以及其他国家的黑客获取相关科研成果。 中方对此有何评论?对此
Top