本地消息表分布式事务

BASE论文

论文链接:https://queue.acm.org/detail.cfm?id=1394128

里面提到,

The most critical factor in implementing the queue, however, is ensuring that the backing persistence is on the same resource as the database. This is necessary to allow the queue to be transactionally committed without involving a 2PC.

也就是说,实现本地消息表的最关键因素是这个本地消息表要和业务数据表位于同一个事务,这样一来,即使不进行2PC,也能保证业务执行成功,消息也会随之发送出去
在这里插入图片描述
在这里插入图片描述
如下图,Insert和两个QueueMessage是一定同时成功,同时失败的

但是这样的话,还有问题没有解决,就是那两个Update和Insert是在不同的数据源的,这样一来就存在2PC问题,或者是让Update幂等,但Update的幂等很难实现。为了实现这样的幂等性,需要再来一张表,记录每笔订单的Update是否被运用了
在这里插入图片描述
至于消息的有序性,即先Insert的被先Update,可以通过增加时间字段,在更新时进行时间判定即可
在这里插入图片描述
在这里插入图片描述

作者还提到,这种引入本地消息表实现解耦的操作,会造成一种软状态,这种软状态会使得交易的双方似乎谁也没有得到物品,但是最终会得到,并且这种软状态持续的时间很短,因此是完全可容忍的

缺陷:业务耦合,不能通用

Java实现

发送端(插入交易)
在这里插入图片描述
接收端(更新用户数据)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

执行Insert的同时,发送消息给Kalfka,同时发送端对future执行阻塞get。Kalfka接收端收到消息后开启事务,更新买卖家数据,如果更新成功,在事务提交之后响应ack;更新失败则在事务回滚之后响应nack。发送端收到ack后,提交事务,收到nack后,会根据配置的次数进行重新发送,一旦超过3次都是nack,则会抛出异常,此时发送端进行回滚。也就是说这里的实现对发送端的事务提交进行了更加严格的限制:只有接收端收到消息并且成功处理消息之后,才允许发送端进行事务提交。这其实是一种同步的分布式事务,跟论文中提到的不太一样。论文中可以看到,发送消息之后,不管接收端有没有消费,只要消息成功发送,就可以提交事务了。这种实现的是比较强的一致性,可能在要求快速响应的场景不适合(付款后增加积分),如果要按照论文的思路,发送端发出去之后,不用future.get了,直接提交事务,然后如果接收方执行失败,反复重试之后依然失败,就打一条日志,人工补偿,这样发送方不用阻塞等待接收方,可以直接返回了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/123688.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

5G边缘计算网关的功能及作用

5G边缘计算网关具有多种功能。 首先,它支持智能云端控制,可以通过5G/4G/WIFI等无线网络将采集的数据直接上云,实现异地远程监测控制、预警通知、报告推送和设备连接等工作。 其次,5G边缘计算网关可以采集各种数据,包…

vue中 process.env 对象为空对象问题

问题:今天在处理vue项目环境问题的时候,发现直接打印 process 对象和打印 process.env 时 env 对象输出结果是不一样的,如下图所示: 在网上搜索了一番后发现还是有挺多朋友对此感到疑惑的,询问了同事,同…

数模之线性规划

线性规划 优化类问题:有限的资源,最大的收益 例子: 华强去水果摊找茬,水果摊上共3个瓜,华强总共有40点体力值,每劈一个瓜能带来40点挑衅值,每挑一个瓜问“你这瓜保熟吗”能带来30点挑衅值,劈瓜消耗20点体力值,问话消耗…

Vue3 简单实现虚拟Table,展示海量单词.利用WebAPI speechSynthesis,朗读英语单词

目录 本页面完整代码 视频演示 完整的页面代码 利用webapi speechSynthesis帮助我们自动郎读英语单词,可以利用这个API,做一些小说朗读或到账提示。 本页面完整代码 用Vue写了一个简单页面,里面还写了一个简单的虚拟Table支持海量数据展示…

ubuntu 18.04安装自己ko驱动 修改secure boot

因为本人老折腾自己的电脑,所以老重装系统,然后配置又不见了,这次配置赶紧记下来 insmod netlink_test.ko 报错:insmod: ERROR: could not insert module netlink_test.ko: Operation not permitted 添加 sudo insmod netlink_te…

XCTF刷题十一道(01)

文章目录 Training-WWW-RobotsPHP2unserialize3view-sourceget_postrobotsbackupcookiedisabled_buttonweak_authsimple_php Training-WWW-Robots robots.txt,防爬虫,访问urlrobots.txt PHP2 phps源码泄露 >phps文件就是php的源代码文件&#xff0…

swift语言用哪种库适合做爬虫?

目录 1、Alamofire 2、URLSession 3、YepHttp 4、Kickbox 5、Vapor 注意事项 总结 在Swift语言中,可以使用第三方库来帮助进行网络爬虫的开发。以下是几个适合Swift语言使用的爬虫库,以及相应的代码示例: 1、Alamofire Alamofire是Sw…

【k8s】pod控制器

一、pod控制器及其功用 Pod是kubernetes的最小管理单元,在kubernetes中,按照Pod的创建方式可以将其分为两类 自主式Pod: kubernetes直接创建出来的Pod,这种Pod删除后就没有了,也不会重建 控制器创建的Pod&#xff1a…

润和软件HopeStage与奇安信网神终端安全管理系统、可信浏览器完成产品兼容性互认证

近日,江苏润和软件股份有限公司(以下简称“润和软件”)HopeStage 操作系统与奇安信网神信息技术(北京)股份有限公司(以下简称“奇安信”)终端安全管理系统、可信浏览器完成产品兼容性测试。 测试…

多路转接(上)——select

目录 一、select接口 1.认识select系统调用 2.对各个参数的认识 二、编写select服务器 1.两个工具类 2.网络套接字封装 3.服务器类编写 4.源文件编写 5.运行 一、select接口 1.认识select系统调用 int select(int nfds, fd_set readfds, fd_set writefds, fd_set ex…

Node.js |(六)express框架 | 尚硅谷2023版Node.js零基础视频教程

学习视频:尚硅谷2023版Node.js零基础视频教程,nodejs新手到高手 文章目录 📚express使用🐇初体验🐇express路由⭐️路由的使用⭐️获取请求参数⭐️获取路由参数🔥练习:根据路由参数响应歌手信息…

小白学爬虫:通过关键词搜索1688商品列表数据接口|1688商品列表数据接口|1688商品列表数据采集|1688API接口

通过关键词搜索1688商品列表数据接口可以使用1688开放平台提供的API接口实现。以下是使用关键词搜索商品列表数据的基本步骤: 1、注册并获取AppKey。 2、构造请求参数,包括搜索关键词、页码、每页条数等。 3、通过API接口链接,将请求参数发送…

简单漂亮的登录页面

效果图 说明 开发环境&#xff1a;vue3&#xff0c;sass 代码 <template><div class"container"><div class"card-container"><div class"card-left"><span><h1>Dashboard</h1><p>Lorem ip…

后台管理系统解决方案-中大型-Vben Admin

后台管理系统解决方案-中大型-Vben Admin 官网 Vben Admin 在线演示 Vben Admin 为什么选择它 github现有20K星&#xff0c;并且它有个可视化生成表单&#xff0c;我很喜欢 快速开始 # 拉取代码 git clone https://github.com/vbenjs/vue-vben-admin-doc# 安装依赖 yarn#…

【ONE·C++ || 网络基础(二)】

总言 主要内容&#xff1a;演示socke套接字编程&#xff08;TCP模式&#xff09;&#xff0c;介绍序列化和反序列化&#xff0c;并进行演示&#xff08;json版本达成协议编写、守护进程介绍&#xff09;。 文章目录 总言4、基于套接字的TCP网络程序4.0、log.hpp4.1、version1.…

C++中将数据添加到文件的末尾

参考:https://blog.csdn.net/qq_23880193/article/details/44279283 C中文件的读取需要包含fstream文件&#xff0c;即&#xff1a;#include 文件的读取和写入是是通过流操作来的&#xff0c;这不像输入、输出流那样&#xff0c;库中已经定义了对象cin和cout 文件的读取需要声…

【 毕设项目源码推荐 javaweb 项目】 基于 springboot+vue 的图书个性化推荐系统的设计与实现(springboot003)

简介 :::warning 【 毕设项目源码推荐 javaweb 项目】 基于 springbootvue 的图书个性化推荐系统的设计与实现适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负…

Etcd 常用命令与备份恢复

1. etcd简介 官方网站&#xff1a;etcd.io 官方文档&#xff1a;etcd.io/docs/v3.5/op-guide/maintenance 官方硬件推荐&#xff1a;etcd.io/docs/v3.5/op-guide/hardware github地址&#xff1a;github.com/etcd-io/etcd etcd是CoreOS团队于2013年6月发起的开源项目&#xf…

算法--数据结构

这里写目录标题 本节内容链表与邻接表链表主要思想链表操作初始化在head结点后面插入普通插入删除操作 例子 双链表&#xff08;双向循环链表&#xff09;主要思想操作初始化双向插入删除第k个点 邻接表主要思想 栈和队列栈主要思想主要操作 队列主要思想操作 单调栈与单调队列…

Kafka中遇到的错误:

1、原因&#xff1a;kafka是一个去中心化结果的&#xff0c;所以在启动Kafka的时候&#xff0c;每一个节点上都需要启动。 启动的命令&#xff1a;kafka-server-start.sh -daemon /usr/local/soft/kafka_2.11-1.0.0/config/server.properties