代码编织梦想

需求:用户的调用时同步阻塞的,即收到了请求2的返回才会请求3

         服务器部署了两个一样的app,app需将用户多次调用产生的对话log写入到pg库,对话一次产生一轮,但同一个session只写入一行,所以采用覆盖,同时由于用户的返回与log入库无关,所以采用子线程异步入库。同时考虑到频繁插入会耗时很大,设置了1s批量插入一次。

实现:如下图,APP部署了两个。实现时,每次开始处理请求时都会去Redis中拉取之前该session存储的请求记录,保证当前内存中含有该请求以及历史请求。处理完该请求后又将请求log存入Redis

                      插入pg库时,会将当前内存里的所有请求入库。入库采用了消费者生产者模式,消费者是1s轮询一次,有值则批量插入,遇到相同key就覆盖。

产生的问题:因为左边APP入库子线程轮询可能处在还未到1s,而右边最新的请求3处理完,子线程准备执行入库时正好到了轮询的1s处,这时右边先入库,左变后入库,会导致左边的请求1,2,覆盖了右边的请求1,2,3,导致3丢失 

 

 

 

 

解决方法:1.入库时检查数据长度,只允许长数据覆盖短数据

                  2.异步因为性能问题无法去掉,可以增加标记请求时间的字段,如果当前请求时间早于已经入库的请求时间,则不覆盖

1-2解决方法都有问题,因为右边app写入时,可能左边app正好读取的是其写入前的状态,最后还是右边先入库,左边后入库

方法3:把开始处理请求3这个状态记录到Redis中,即右边app收到请求3时,里面同步写一个状态到redis,左边app子线程写库前先去看redis的状态是否已经有请求3了,有的话,不入库

方法3也有问题,假如右app主线程收到请求3时将该消息写入了Redis前左边app子线程入库时就做了状态查询,此时左app会继续入库,如果批量入库的数量较大,请求2又排在后面,可能写请求2的时间会很长,在这段长时间内,有可能右app主线程完成了接受请求3,通知Redis,再异步子线程入库,这一系列操作都赶在左app入库完成之前,那还是会有这个问题

方法4:既然问题出在请求3先与请求2入库,那入库的子线程在入库前区分一下请求2还是请求3,如果是请求3就又塞回到队列,并记录当前是第二次塞入,这样请求3入库延时肯定会比请求2长,即请求2肯定先入库

方法5:用Redis记录6种状态。

方法6:也是最终应用的方案;直接在请求2入库时sql判断,如果已经有记录则不覆盖,而请求3入库时sql为如果有记录则强行覆盖,可以避免因2覆盖3的问题。

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/iin729/article/details/110940455

day2-运算符和分支结构-爱代码爱编程

python支持的运算符:数学运算符、比较运算符、逻辑运算符、*位运算 数学运算符 +(加)、-(减)、*(乘)、/(除)、//(整除)、%(取余、取模)、**(幂运算) +、-、*、/ 和数学中的+、-、×、÷ 功能和用法一模一样 注意:/(除法运算)的运算结果是浮点型 print(1+1) # 2 print(2-5) # -3 print

python计算bmi-爱代码爱编程

class bmi: def __init__(self,name,age,weight,height): self.name=name self.age=age self.weight=weight self.height=height def say_hello1

2020/11/24:django进阶-爱代码爱编程

2020/11/24:django进阶 一、模板继承 模板继承的使用: 在master.html中定义模板:{% block css %}{% endblock %}在子类中引入要继承的模板:{% extends “master.html” %}模板导入: 使用时直接导入即可:{% include “tag.html” %} 模板:templa

5分钟,就5分钟!保证教会你怎么用Sentry 监控你的Spring Boot应用-爱代码爱编程

前言 Sentry是一个应用监控系统,可以用于前后端各种技术栈的线上监控和错误分析,这次我们用它来进行Spring Boot项目的线上日志分析实践。 创建项目 首先需要根据提示在Sentry中创建好项目,项目平台(platform)可以选择Spring Boot或者Java。 引入依赖&配置 Sentry提供了官方的Spring Boot

大恒相机设置采集间隔1秒,实际上显示滞后10秒-爱代码爱编程

非常奇怪,采集速率确实是1s采集一次。但是cv2实时显示就是10s后才显示 # -*- coding: utf-8 -*- # version:1.0.1905.9051 import cv2, sys import gxipy as gx device_manager = gx.DeviceManager() dev_num, dev_info_

树莓派开发笔记(十一):蓝牙的使用,BlueZ协议(双树莓探测rssi并通过蓝牙互传获取的rssi信号强度)-爱代码爱编程

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://blog.csdn.net/qq21497936/article/details/110940484长期持续带来更多项目与技术分享,咨询请加QQ:21497936、微信:yangsir198808红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、Op

PostgreSql对空间数据的操作函数-爱代码爱编程

GIS开发对数据的操作,主要是对空间数据的操作。PostgreSql提供了一些处理空间数据的函数,操作起来是比较方便的。下面就记录一下,最近做项目里面用到的一些,也是比较常用的。 空间数据 介绍这些函数之前,先了解一下什么是空间数据。空间数据是指用来表示空间实体的位置、形状、大小及其分布特征诸多方面信息的数据,它可以用来描述来自现实世界的目标,它具有定

Ora2Pg配置文件详解-爱代码爱编程

说明 此说明基于ora2pg v21.0版本 配置文件说明 配置项用途说明默认值/格式IMPORT导入配置文件将通用配置保存为文件后,其他文件导入后不用再编辑通用配置-INPUT_FILE导入文件内容只能用于导入函数、存储过程和包定义-ORACLE_HOME设置Oracle home目录ora2pg安装前已配置环境变量,这项基本用不到-ORACLE_

postgres使用入门-安装-爱代码爱编程

postgres使用手册 一、postgres是什么?二、软件下载及安装1.软件下载2.软件安装内网本地安装官网下载源码安装3.软件使用总结 一、postgres是什么? 因为大家都在用所以想挣钱就得知道、会、 好处 https://www.zhihu.com/question/20010554https://blog.csdn.net/we

postgresql 备份和恢复-爱代码爱编程

你是不是经常使用pgadmin3/4 备份数据,等到恢复的时候发现各种错误,相同版本的可能函数没有被恢复,索引没有被恢复。版本号不同的好像我就没成功过。来试试命令备份恢复吧,打破版本限制(目前只测试了9.5-10的) 使用.bak文件 备份:进入pgsql安装目录:C:\Program Files\PostgreSQL\10\bin,使用 pg_dum

postgresql9.6在linux系统中使用UUID-爱代码爱编程

环境 Linux版本:CentOS 8,腾讯云的PostgresSQL版本:postgresql-9.6.2正文 1、试图安装uuid插件 postgres=# create extension "uuid-ossp" ; ERROR:  could not open extension control file "/usr/local/pgsql/

4. Further Information-爱代码爱编程

除了本文档,还有其他PostgreSQL的有关资源: Wiki     PostgreSQL wiki页面,包含项目常见问题(FAQ),TODO列表,以及其他很多话题的详细信息。 Web Site     PostgreSQL网站提供了最新版本的详细信息及能够让你更有效使用PostgreSQL的其他信息。     Mailing Lists