SAGA

一文看懂分布式事务

走远了吗. 提交于 2020-02-25 22:58:25
本地事务 事务Transaction由一组SQL组成,具有四个ACID特性。 ACID 1. Atomicity 原子性,构成事务的一组SQL,要么全部生效,要么全不生效,不会出现部分生效的情况 2. Consistency 一致性,数据库经过事务操作后从一种状态转变为另一个状态。可以说原子性是从行为上描述,而一致性是从结果上描述 3. Isolation 隔离性,事务操作的数据对象 相对于 其他事务操作的数据对象相互隔离,互不影响 4. Durability 持久性,事务提交后,其结果就是永久性的,即使发生宕机(非磁盘损坏) 事务实现 对于MySQL数据库(InnoDB存储引擎)而言,隔离性是通过不同粒度的锁机制来实现事务间的隔离;原子性、一致性和持久性通过redo log重做日志和undo log回滚日志来保证的。 1. redo log,当数据库对数据做修改的时候,需要把数据页从磁盘读到buffer pool中,然后在buffer pool中进行修改,那么这个时候buffer pool中的数据页就与磁盘上的数据页内容不一致,称buffer pool的数据页为dirty page脏数据,如果这个时候发生非正常的DB服务重启,那么这些数据还没在内存,并没有同步到磁盘文件中(注意,同步到磁盘文件是个随机IO),也就是会发生数据丢失,如果这个时候,能够在有一个文件,当buffer

聊一聊 redux 异步流之 redux-saga

老子叫甜甜 提交于 2020-01-20 22:49:31
让我惊讶的是, redux-saga 的作者竟然是一名金融出身的在一家房地产公司工作的员工(让我想到了阮老师。。。),但是他对写代码有着非常浓厚的热忱,喜欢学习和挑战新的事物,并探索新的想法。恩,牛逼的人不需要解释。 1. 介绍 对于从来没有听说过 redux-saga 的人,作者会如何描述它呢? It is a Redux middleware for handling side effects . —— Yassine Elouafi 这里包含了两个信息: 首先, redux-saga 是一个 redux 的中间件,而中间件的作用是为 redux 提供额外的功能。 其次,我们都知道,在 reducers 中的所有操作都是同步的并且是纯粹的,即 reducer 都是纯函数, 纯函数是指一个函数的返回结果只依赖于它的参数,并且在执行过程中不会对外部产生副作用 ,即给它传什么,就吐出什么。但是在实际的应用开发中,我们希望做一些异步的(如Ajax请求)且不纯粹的操作(如改变外部的状态),这些在函数式编程范式中被称为“副作用”。 Redux 的作者将这些副作用的处理通过提供中间件的方式让开发者自行选择进行实现。 redux-saga 就是用来处理上述副作用(异步任务)的一个中间件。它是一个接收事件,并可能触发新事件的过程管理者,为你的应用管理复杂的流程。 2. 先说一说 redux

从一次小哥哥与小姐姐的转账开始, 浅谈分布式事务从理论到实践

自作多情 提交于 2020-01-08 15:14:09
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 分布式事务是个业界难题,在看分布式事务方案之前,先从单机数据库事务开始看起。 什么是事务 事务(Transaction)是数据库系统中一系列操作的一个逻辑单元,所有操作要么全部成功要么全部失败。 可以看一个经典的转账事务示例,小哥哥转账100元给小姐姐: begin: 操作1:查询小哥哥账号余额,确保余额充足 操作2:从小哥哥账号扣除100元 操作3:往小姐姐账号增加100元 commit; 转账的一系列操作就是一个事务,事务会确保这一系列操作要么全部成功,要么全部失败。 ACID 谈起事务就不得不谈事务的四大特性ACID 原子性(Atomicity) 一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被恢复(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。 还拿之前的转账案例来理解,原子性就是要求转账的一系列操作(操作1、操作2、操作3)要么全部完成,要么全部失败。不能出现钱转了一半的情况,比如小哥哥的账号钱扣除成功了,但是小姐姐账号加钱的操作失败了,这种属于不满足原子性。 一致性(Consistency) 一致性这个词总是一个让人困惑话题,有时不同语境下说的都不是同一个事情。我们先看看维基百科定义:

为什么在Redux中我们需要中间件来实现异步流?

浪子不回头ぞ 提交于 2020-01-07 01:54:09
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 根据文档, “没有中间件,Redux存储仅支持同步数据流” 。 我不明白为什么会这样。 为什么容器组件不能调用异步API,然后 dispatch 操作? 例如,想象一个简单的UI:一个字段和一个按钮。 当用户按下按钮时,该字段将填充来自远程服务器的数据。 import * as React from 'react'; import * as Redux from 'redux'; import { Provider, connect } from 'react-redux'; const ActionTypes = { STARTED_UPDATING: 'STARTED_UPDATING', UPDATED: 'UPDATED' }; class AsyncApi { static getFieldValue() { const promise = new Promise((resolve) => { setTimeout(() => { resolve(Math.floor(Math.random() * 100)); }, 1000); }); return promise; } } class App extends React.Component { render() { return ( <div>

How do I resolve an autowire conflict with NHibernateSagaPersister?

不羁的心 提交于 2020-01-03 02:08:11
问题 I'm trying to wire up my first Saga, and have been unable to get the receiving endpoint to handle start message properly. I get the following exception: SagaMessageHandler Failed handling message. Spring.Objects.Factory.UnsatisfiedDependencyException: Error creating object with name 'NServiceBus.Sagas.Impl.SagaMessageHandler' : Unsatisfied dependency expressed through object property 'Persister': There are 2 objects of Type [NServiceBus.Saga.ISagaPersister] for autowire by type, when there

nextjs的开发使用(二)---引入redux状态管理

六眼飞鱼酱① 提交于 2019-12-29 03:10:19
在上篇文章中, 基于react的nextjs服务端渲染框架学习使用 学习了解了一些关于nextjs的东西,并做了一个小demo,这篇文章将对上篇文章做一个补充,在nextjs中引入redux 安装 // 安装redux相关依赖 yarn add redux redux-saga react-redux // 安装next.js对于redux的封装依赖包 yarn add next-redux-wrapper next-redux-saga yarn add redux react-redux 创建目录及文件 创建redux文件夹,并在下面创建index.js,actions,reducers,rootSaga.js文件 1、redux/index.js 初始化store import { createStore, applyMiddleware } from 'redux'; import createSagaMiddleware from 'redux-saga'; import rootSaga from './rootSaga'; import rootReducer from './reducers'; export function initializeStore(initialState){ // 创建一个 Saga middleware const

腾讯金融级核心交易解决方案TDMesh深度实践

天大地大妈咪最大 提交于 2019-12-27 12:38:42
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 近日,在ArchSummit全球架构师峰会上,腾讯计费团队分享了在金融级核心交易解决方案TDMesh上的深度实践。这也是腾讯计费继今年5 月在腾讯全球数字生态大会首次线下展示后的又一大动作。 据了解,腾讯计费是孵化于支撑腾讯内部业务千亿级营收的互联网交易平台,它汇集了国内外主流支付渠道,提供账户管理、精准营销、安全风控、稽核分账、计费分析等多维度服务。平台承载腾讯公司收入大盘, 百亿级账户、百亿级日交易、覆盖180+个国家(地区)、服务数万业务和上百万商户,是一个全方位的一站式计费平台。 TDMesh 由支撑腾讯内部15年的计费技术体系孵化而来,包含全域一致性、海量请求支撑、7*24不间断服务管理、秒级的智能监控和弹性伸缩等多个功能板块,共同组成一套全面的金融级处理方案。 腾讯计费平台部总经理李纲表示:“基于计费的高一致、高性能、高可用、高可靠技术要求等挑战,腾讯计费平台部基于服务内部业务的多年经验,将核心技术板块全面优化整合,推出一套金融级的核心交易解决方案TDMesh。在不断自我进化持续打磨的同时,也希望通过参与相关技术讨论,与合作伙伴共同构建金融级高一致技术范例,推动行业发展。” 应对 ”四高“ 挑战,腾讯计费的技术构建思路 腾讯计费系统的基础建设起步于 2004 年,在此后 15 年的发展过程中

Are orchestration services unfit to implement a workflow process?

筅森魡賤 提交于 2019-12-25 02:58:24
问题 i'm facing with a problem during the implementation of a workflow process with nservicebus, i use version 2.0.1329.2 and the workflow i'm trying to implement is quite simple: I have a List of articles that need to be computed, the workflow starts with the first list published. After that the user can do other publish adding or deleting some articles from the original list. Every list has a code identifier. I have implemented it using an orchestration service identified by the list's code. In

Why does NServiceBus Saga timeout request use wrong Saga ID?

筅森魡賤 提交于 2019-12-25 01:44:29
问题 My Saga message handler (configured as ISagaStartedBy) requests a timeout message for every message received. Debugging through a few messages at a time, I've found the time the first time the handler is fired, the saga ID sent to the timeout manager is different to the one a) persisted in the database and b) the saga ID sent in subsequent messages. The subsequent messages all send the Saga ID from the database. Here's the handler: public void Handle(PaymentRequested message) { int

Why does NServiceBus Saga timeout request use wrong Saga ID?

不想你离开。 提交于 2019-12-25 01:29:00
问题 My Saga message handler (configured as ISagaStartedBy) requests a timeout message for every message received. Debugging through a few messages at a time, I've found the time the first time the handler is fired, the saga ID sent to the timeout manager is different to the one a) persisted in the database and b) the saga ID sent in subsequent messages. The subsequent messages all send the Saga ID from the database. Here's the handler: public void Handle(PaymentRequested message) { int