96SEO 2026-02-20 08:52 11
。

另外#xff0c;在异步操作中#xff0c;我们提供接口让外部服务回调。
回调过程中#xff0c;也可能出现故障。
微服务设计中跨服务的调用由于网络或程序故障等各种原因经常会出现调用失败而需要重试。
另外在异步操作中我们提供接口让外部服务回调。
回调过程中也可能出现故障。
本文主要是想介绍在没有订单号、支付流水号等业务唯一性的场景下使用一张任务表实现上面的异步操作达到最终一致性。
查询下一次重试时间早于当前时间的记录每次拉取N条。
定时机制可以依赖xxl-job这样的分布式定时任务。
notifyTasksRepository.findTop50ByNextTimeBeforeOrderByNextTimeAsc(DateUtil.date());2、指数级重试
calcNextRetryTime();this.lastTime
LocalDateTime.ofInstant(Instant.now(),
lastTime.plus(exp(this.retryTimes),
nextTime.atZone(zone).toInstant();return
既然是微服务之间的异步操作流程就需要设计一个类似于订单号能够贯穿整个流程。
它就是请求流水号要求是不能重复。
发起请求、回调通知和主动查询都是需要传递该字段。
这是一个json格式的string字符串当外部服务是post请求的时候请求报文就保存在该字段。
而如果仅仅是保存http接口的请求入参的话在实际不同的业务还是不够的。
比如http接口需要requestNo和classroomId两个字段就可以了。
而你的业务系统里还需要字段课程编号和讲次编号那么请一并把它们都保存进去。
待外部服务回调的时候根据requestNo请求流水号查询任务需要反解析该字段取出需要的课程编号和讲次编号。
JsonIgnoreProperties(ignoreUnknown
从上面的流程图也可以看出业务逻辑处理是有两个方向一是业务方的回调二是定时任务的主动查询。
所以无论从哪个链路获取到的返回结果都应该是一样的实际上也如此。
复制课堂返回一个新的课堂ID。
由于我们在不同的业务流程中都会有复制课堂的需求所以需要用任务编号加以区分。
而外部服务是不会关注你的任务更遑论任务编号了。
进一步说复制课堂只需要知道原课堂ID即可不要去让它去关心是什么业务下的复制。
sourceClassroomId;ApiModelProperty(notes
newClassroomId;ApiModelProperty(notes
{/api/v1/classroom/copy/callback})public
ResponseEntity.ok(classroomAppService.copyResultNotify(notify));}2、服务层ClassroomAppService.java
notifyTasksRepository.findByRequestNoAndTaskCode(request.getRequestNo(),Constants.TaskCode.CLASSROOM_COPY_RESULT);if
SubscribeAllowConcurrentEventsTransactional(rollbackFor
onNotifySuccessEvent(NotifySuccessEvent
JsonUtils.toJsonString(event));}switch
Constants.TaskCode.CLASSROOM_COPY_RESULT://
JSON.parseObject(event.getRequestJson(),
JSON.parseObject(event.getResponseJson(),
ClassroomCopyResultNotify.class);//
调用业务逻辑处理break;default:break;}}4、业务逻辑处理
notifyTasksRepository.deleteByRequestNoAndTaskCode(requestNo,
Constants.TaskCode.CLASSROOM_COPY_RESULT);5、发起对外部服务的请求
ClassroomCopyRequest.builder().requestNo(requestNo).classroomId(sourceClassroomId).lectureNo(lectureNo).courseNo(courseNo).taskCode(taskCode).build();//
notify方法发起Http请求如果失败则会像下面的语句一样保存至定时任务表
notifyTasksService.notify(taskCode,
notifyTasksService.schedule(Constants.TaskCode.CLASSROOM_COPY_RESULT,
gson.toJson(request));schedule()方法的定义见下
notifyParams)这里的设计思路是发起外部服务的请求同时保存主动查询的任务到库里。
外部服务处理完成回调我们的时候需要把主动查询的任务届时删除。
防止不必要的查询主动查询复制结果的任务必须在发起请求的时候同时就保存到库表里。
这是因为回调的报文中只有请求流水号requestNo在处理回调的时候需反查出本任务记录。
向外部服务发起请求的时候保存主动查询的任务(任务内容见notifyParams)
业务逻辑处理完成后删除主动查询的任务。
否则定时任务会一直轮询该任务浪费性能。
分布式定时任务cron表达式规则下每次查询N条待处理的任务列表。
主动查询结果的任务如果处理出现失败的时候则需要更新下一次重试时间支持指数级的退避重试。
本文试着通过一个任务表向你表述如何实现重试补偿以实现跨服务间的最终一致性。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback