jmeter登录返回数据给下一个接口_mysql读写分离实现

jmeter登录返回数据给下一个接口_mysql读写分离实现问题描述场景是这样的,我们的支付系统在一笔支付完成后,需要发出通知给到商户。支付完成的消息通过消息队列发送给通知的服务。通知服务的有一部分处理逻辑是这样的:notifyPersist.saveNotifyRecord(notifyRecord);notifyRecord=rpNotifyService.getNotifyByMerchant…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

问题描述

场景是这样的,我们的支付系统在一笔支付完成后,需要发出通知给到商户。支付完成的消息通过消息队列发送给通知的服务。通知服务的有一部分处理逻辑是这样的:

            notifyPersist.saveNotifyRecord(notifyRecord);
            notifyRecord = rpNotifyService.getNotifyByMerchantNoAndMerchantOrderNoAndNotifyType(notifyRecord.getMerchantNo(), notifyRecord.getMerchantOrderNo(), notifyRecord.getNotifyType());
            notifyQueue.addElementToList(notifyRecord);

三行代码。我解释下,通知服务收到消息解析成 notifyRecord 对象,然后存入数据库,然后马上取出添加到任务队列。另外又一个独立的线程去处理这个任务队列。

项目上线后,客户反馈偶尔会出现收不到通知的情况。

问题排查

经过日志跟踪,我发现是在上述代码的第二行,查询记录的时候数据库返回null,也就是没有查询到记录。导致任务队列没有该笔支付的通知任务。

一开始觉得非常不解,因为通过日志我们发现第一行代码是执行成功的,既然插入成功了,没理由查询不到啊??而且我去数据库看确定是有这条记录的。莫非是见鬼了!!

我先说下

慢慢静下心来思考,结合这个现象是偶发性的,我想到有没有可能是因为读写分离延时造成的。我先说下我们的存储架构:

centos 6.5 64位操作系统。mycat1.6版本,mysql 5.6.21

数据库服务器有两台,一台主,一台从,利用mycat配置了主从复制和读写分离。写操作在主机上,读操作在从机上。如下图所示:

在这里插入图片描述

有没有可能是主库上插入成功后,从库还没有来得急同步完成,应用就马上查询,所以查不到。为了验证我的想法,我把代码改成下面这样发布到生产先看看效果:

notifyPersist.saveNotifyRecord(notifyRecord);
Thread.sleep(300);
notifyRecord = rpNotifyService.getNotifyByMerchantNoAndMerchantOrderNoAndNotifyType(notifyRecord.getMerchantNo(), notifyRecord.getMerchantOrderNo(), notifyRecord.getNotifyType());
notifyQueue.addElementToList(notifyRecord);

思路也很简单粗暴,就是插入之后不马上读,而是等一会让从库同步完再读。发布后,跑了一个段时间,没有反馈异常。证明我怀疑的没错,问题确实出现在mycat读写分离延时上。

解决方案

当然,上面定位问题的sleep也勉强算是一个解决方案。只不过感觉比较low,原理很好理解。在插入数据和查询数据中间加一个sleep()方法,相当于等一会再读。如果应用对时效要求不高,
此方法也不失唯一种快速有效的方案。

找到了问题的根源我就去mycat的官网和相关论坛寻找解决方案。

功夫不负有心人,后来我查到相关资料,mycat可以通过注解的方式指定某些 sql 语句强制走主库,如下所示:

<select id="listBy" parameterType="java.util.Map" resultMap="BaseResultMap">
    /**mycat:db_type=master*/select * from rp_notify_record
    <where>
      <include refid="condition_sql" />
    </where>
    <![CDATA[ order by create_time desc]]>
  </select>

注意到 /** */里面的注解,通过指定 db_type=master 保证后面的 sql 语句走主库。这样就不存在延时导致查询不到的问题了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/182491.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ov7725摄像头人脸识别_监控摄像头图像倒置怎么办

    ov7725摄像头人脸识别_监控摄像头图像倒置怎么办前言:摄像头的工作原理大致为:景物通过镜头(LENS)生成的光学图像投射到图像传感器表面上,然后转为电信号,经过A/D[1](模数转换)转换后变为数字图像信号,再送到数字信号处理芯片(DSP)中加工处理,再传输给其他显示硬件就可以显示看到图像了我要讲解的是0V7725摄像头,带FIFO缓存,以及通过STM32F103MCU进行控制,在采用ILI9341控制器芯片的液晶屏(分辨率240*32

    2022年9月15日
    4
  • 极光漏洞,”极光”ie漏洞,微软发布2010年第一个IE 0day漏洞“极光”警告、最新官方补丁和解决办法

    极光漏洞,”极光”ie漏洞,微软发布2010年第一个IE 0day漏洞“极光”警告、最新官方补丁和解决办法微软2010年1月14日晚发布公告称,黑客在最近的针对Google、Adobe以及其他公司的攻击中利用了IE零日漏洞。远程代码执行漏洞影响到各Windows版本上运行的近乎全部的IE版本。关键字:极光

    2022年7月2日
    21
  • BS架构和CS架构的区别

    BS架构和CS架构的区别介绍BS:(Browser/Server,浏览器/服务器模式),web应用可以实现跨平台,客户端零维护,但是个性化能力低,响应速度较慢。CS:(Client/Server,客户端/服务器模式),桌面级应用响应速度快,安全性强,个性化能力强,响应数据较快区别硬件环境不同C/S用户固定,一般只应用于局域网中,要求拥有相同的操作系统,如果对于不同操作系统还要相应开发不同的版本,并且对…

    2022年6月15日
    31
  • Windows程序设计——画圆[通俗易懂]

    Windows程序设计——画圆[通俗易懂]代码如下:#include<windows.h>#include<stdlib.h>#include<string.h>long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam);BOOL InitWindowsClass(HINSTANCE hInstance…

    2022年8月18日
    12
  • ffmpeg 无法解析 外部符号「建议收藏」

    ffmpeg 无法解析 外部符号「建议收藏」出现errorLNK2019:无法解析的外部符号”void__cdeclav_close_input_file(structAVFormatContext*)”([email=?av_close_input_file@@YAXPAUAVFormatContext@

    2022年6月28日
    58
  • PLSQL注册码,亲测,可用

    PLSQL注册码,亲测,可用注册码:ProductCode:4t46t6vydkvsxekkvf3fjnpzy5wbuhphqzserialNumber:601769password:xs374ca1.登录PLSQL,选择取消2.选择帮助,注册3.在弹出的注册框内填写上面的注册码,点击注册即可使用

    2022年7月24日
    15

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号