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

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

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

1 背景

在分布式场景下,为了保障系统的可用性和数据的最终一致性,采用基于消息队列(MQ)的重试机制是一种常见的解决方案。伪代码如下:mLg28资讯网——每日最新资讯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);}

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

2 方案

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

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

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

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

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

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

3 效果

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

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

除此之外,我们还为开发人员提供了一些可选项,提供一些可配置的能力。mLg28资讯网——每日最新资讯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 总结

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

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

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

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

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

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

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

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

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

标签:
  • 热门焦点
  • Redmi Pad评测:红米充满野心的一次尝试

    从Note系列到K系列,从蓝牙耳机到笔记本电脑,红米不知不觉之间也已经形成了自己颇有竞争力的产品体系,在中端和次旗舰市场上甚至要比小米新机的表现来得更好,正所谓“大丈夫生居
  • 石头自清洁扫拖机器人G10S评测:多年黑科技集大成之作 懒人终极福音

    科技圈经常能看到一个词叫“缝合怪”,用来形容那些把好多功能或者外观结合在一起的产品,通常这样的词是贬义词,但如果真的是产品缝合的好、缝合的实用的话,那它就成了中性词,今
  • 跑分安卓第一!Redmi K60至尊版8月发布!卢伟冰:目标年度性能之王

    8月5日消息,Redmi K60至尊版将于8月发布,在此前举行的战略发布会上,官方该机将搭载搭载天玑9200+处理器,安兔兔V10跑分超177万分,是目前安卓阵营最高的分数
  • 把LangChain跑起来的三个方法

    使用LangChain开发LLM应用时,需要机器进行GLM部署,好多同学第一步就被劝退了,那么如何绕过这个步骤先学习LLM模型的应用,对Langchain进行快速上手?本片讲解3个把LangChain跑起来
  • JavaScript学习 -AES加密算法

    引言在当今数字化时代,前端应用程序扮演着重要角色,用户的敏感数据经常在前端进行加密和解密操作。然而,这样的操作在网络传输和存储中可能会受到恶意攻击的威胁。为了确保数据
  • Temu起诉SHEIN,跨境电商战事升级

    来源 | 伯虎财经(bohuFN)作者 | 陈平安日前据外媒报道,拼多多旗下跨境电商平台Temu正对竞争对手SHEIN提起新诉讼,诉状称Shein&ldquo;利用市场支配力量强迫服装厂商与之签订独家
  • 大厂卷向扁平化

    来源:新熵作者丨南枝 编辑丨月见大厂职级不香了。俗话说,兵无常势,水无常形,互联网企业调整职级体系并不稀奇。7月13日,淘宝天猫集团启动了近年来最大的人力制度改革,目前已形成一
  • 微博大门常打开,迎接海外画师漂洋东渡

    作者:互联网那些事&ldquo;起猛了,我能看得懂日语了&rdquo;。&ldquo;为什么日本人说话我能听懂?&rdquo;&ldquo;中文不像中文,日语不像日语,但是我竟然看懂了&rdquo;&hellip;&hell
  • iQOO Neo8系列或定档5月23日:首发天玑9200+ 安卓跑分王者

    去年10月,iQOO推出了iQOO Neo7系列机型,不仅搭载了天玑9000+,而且是同价位唯一一款天玑9000+直屏旗舰,一经上市便受到了用户的广泛关注。在时隔半年后,
Top