当前位置: 首页 > news >正文

html5高端网站建设织梦模板怎么免费做网站

html5高端网站建设织梦模板,怎么免费做网站,上犹建设局网站,加强协会网站建设意义一、背景 在微服务框架下,跨服务之间的调用,当遇到操作耗时或者量大的情况,我们一般会采用异步编程实现。 本文出现的问题是:异步回调过来时,却未查询到数据库中的任务,导致未能正常处理回调。 下面是当…

一、背景

在微服务框架下,跨服务之间的调用,当遇到操作耗时或者量大的情况,我们一般会采用异步编程实现。

本文出现的问题是:异步回调过来时,却未查询到数据库中的任务,导致未能正常处理回调。
在这里插入图片描述

下面是当时的日志信息:
在这里插入图片描述
根据此请求流水号查询数据库,得到入库时间:
在这里插入图片描述

总结下,产生这个错误的原因是数据库入库的时间晚于回调处理中查库的时间。

那么要如何避免这个问题呢?

有人可能要说,既然插入数据库的时间慢,是不是可以改为保存到redis呢?

要保证请求流水号存在,不一定要入库(redis也是为了实现插入快),所以我建议把它保存在jvm内存缓存中(具体实现可以是Map集合,也可以是caffeine)。

但是遇到生产环境分布式环境下,主服务是多节点部署的情况下,这个并不能解决问题。

所以还是调整代码的顺序,先入库,再发起http请求。(尽可能地做到先入库,实在不行,延迟1秒后再发起http请求)

当然,为了数据的实时性,不建议增加延时调用。因为这是偶现的极端情况。

二 、系统设计

在这里插入图片描述

如果外部服务从接收请求,到回调主服务,这个过程只有几十毫秒;也就是说,主服务收到外部服务的回调,是早于主服务把任务持久化到DB,在处理回调的时候,根据请求流水号无法查询到任务详情。

在极端的情况下,便出现了如下异常流程:
在这里插入图片描述

三、如何保证查询

要解决上面的异常流程,可以采用以下几种办法:

  • 1、先保存任务表,再发起http请求。
  • 2、在收到外部服务的回调后,第一时间未查询到,则查询第二次,第三次…… 尝试多次查询,等待保存任务表的插入语句操作完成。
  • 3、主服务向外部服务发起主动查询操作结果。(外部服务提供一个根据请求流水号查询详情的接口)

1、调整发起请求的代码顺序

// 先保存至本地缓存
requestNoService.saveCache(requestNo, gson.toJson(request));// 保存至定时任务表
NotifyTasks notifyTasks = notifyTasksService.schedule(Constants.TaskCode.QUERY_CLASSROOM_COPY_RESULT, requestNo,assemblerCopyResultRequestUrl(requestNo), gson.toJson(request));// 再发起复制请求,避免出现回调收到了,但是本地表中没有数据,导致回调失败。
ApiResult<?> apiResult = notifyTasksService.notify(taskCode, notifyTasks.getRequestNo(),urlBuilder.toString(), gson.toJson(request));

修改前的代码:

// 发起复制请求
ApiResult<?> apiResult = notifyTasksService.notify(taskCode, requestNo, urlBuilder.toString(), gson.toJson(request));// 保存至定时任务表
notifyTasksService.schedule(Constants.TaskCode.CLASSROOM_COPY_RESULT, requestNo,assemblerCopyResultRequestUrl(requestNo), gson.toJson(request));

2、多次延迟查询

重试3次,每次延迟1秒后再发起查询

	private String getNotifyParamsFromDB(String requestNo) {int attempt = 0;while (attempt < 3) {NotifyTasks notifyTasks = notifyTasksRepository.findTop1ByRequestNo(requestNo);if (null != notifyTasks) {return notifyTasks.getNotifyParams();}ThreadUtil.sleep(1, TimeUnit.SECONDS);attempt++;}return null;}

3、发起主动查询

定时任务,每隔5分钟,由主服务向外部服务发起主动查询。

这也是配套异步处理方案的常规处理动作。

比如交易系统里的支付操作,往往就需要商户主动向三方支付发起查询,询问支付中的订单状态其结果。

四、总结

异步编程,要求数据的一致性,往往采取的是最终一致性。

意味着在绝大多数情况下,实时回调可以保证数据更新的及时性,少数以及异常情况下,通过主动查询可以保证数据的最终一致性。

本案例中,主要是回调的速度快于本地数据库的入库,所以问题是少见的,一般也很难排查。

http://www.ds6.com.cn/news/13084.html

相关文章:

  • 餐饮业建设网站意义一呼百应推广平台
  • 盘龙城做网站网络推广公司如何做
  • 虚拟币交易网站源码青海百度关键词seo
  • wordpress转成中文成都网站关键词推广优化
  • 网站技术维护费创建自己的网页
  • 铜仁北京网站建设手机百度2020最新版
  • 自己做网站需要服务器吗沈阳今天刚刚发生的新闻
  • 贵阳快速建站模板最有效的网络推广方式和策略
  • 个人网站 服务器免费优化推广网站的软件
  • 福建省建设资格注册中心网站下载百度导航最新版本
  • 求个网站能用的郑州网站关键词优化公司
  • 中企动力员工待遇怎么样武汉seo服务
  • 网站导航图怎么做的详细步骤百度163黄页关键词挖掘
  • 东莞一站式网站建设荥阳网站优化公司
  • 百度喜欢什么样的网站win7优化配置的方法
  • 郑州网站建设服务商对网络营销的认识有哪些
  • 网站建设专业导航网站环球军事网
  • 水头做网站南京网站设计公司大全
  • 去国外做外卖网站app营销策划方案
  • 如何形容网站开发公司技术经验上海网络营销
  • 小程序开发平台排名wp博客seo插件
  • 找人做设计的网站品牌运营包括哪些内容
  • 网站建设文档模板泰州百度关键词优化
  • 电子产品去什么网站做站点seo搜索引擎优化课程
  • 外贸批发网站有哪些平台中文搜索引擎有哪些
  • wordpress安装二级目录下上海关键词优化公司哪家好
  • 建立良好的公共秩序教学反思网站优化入门免费教程
  • 天津做网站的公司怎么样推广方案经典范文
  • 信息技术做网站百度关键词推广公司哪家好
  • 营销专业网站百度平台电话