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

网站开发框架 简单/百度点击软件

网站开发框架 简单,百度点击软件,我先做个网站怎么做的,wordpress bible pdfstorm 事务 需求 storm 对于保证消息处理,提供了最少一次的处理保证。最常见的问题是如果元组可以被 重发,可以用于计数吗?不会重复计数吗? strom0.7.0 引入了事务性拓扑的概念,可以保证消息仅被严格的处理一次。因此可…

storm 事务


需求


storm 对于保证消息处理,提供了最少一次的处理保证。最常见的问题是如果元组可以被
重发,可以用于计数吗?不会重复计数吗?
strom0.7.0 引入了事务性拓扑的概念,可以保证消息仅被严格的处理一次。因此可以以完
全精确的、可扩展的、容错的方式处理类似计数这类的情形。
跟分布式 RPC 类似,事务性拓扑也不是 storm 的新特性,而仅仅是在 storm 原语如数据
流、spout、bolt 和拓扑基础上的高层抽象。


概念


我们先研究最简单的情形,然后进行一个迭代设计,直到达到 storm 的设计级别。


设计一


事务性拓扑的核心观点是数据处理的强有序。
一次只处理一个元组,直到该元组被成功处理,才开始处理下一个元组。
每个元组关联一个事务 ID。
如果元组处理失败,需要重发,重发的时候使用相同的事务 ID。

事务 ID 是一个整数,该整数对每个元组都会增长,也就是第一个元组的事务 ID 是 1,第
二个是 2,以此类推。
强有序保证了即使在元组重发的情况下对该元组也仅仅处理一次。
假设我们要统计一下数据流中元组的全局计数。应该将计数和最新的事务 ID 一起作为一条
记录存储到数据库中。
只能是数据库中的事务 ID 和当前元组的事务 ID 不同的时候,更新数据库中的数据。
3tx c8 db
3tx c12 tuple


考虑两种情形:


1、 数据库中的事务 ID 和当前的事务 ID 不同:由于事务的强有序,数据库中的计数不包
括当前元组。我们可以安全地更新数据库中的计数和事务 ID。
2、 数据库中的事务 ID 和当前元组的事务 ID 相同:当前元组已经统计在数据库中的计数
中了,放弃这次对数据库的更新。因为当前的元组肯定是在更新完数据库之后,通知
storm 处理成功之前出错了。
而且,这种拓扑的设计可以在同一个事务内更新很多源的状态,而且是精确地只处理一
次。如果某些源更新失败了需要重发元组,已经更新成功的源会跳过重试,失败的源会合
理地处理重试。


但是一次只处理一个元组有很大的缺陷:


1、因为等前一个元组完全处理了再处理下一个元组是一件很恐怖的事情 ,效率低,
时间长。
2、大量调用数据库(起码每个元组一次),
3、没有发挥 storm 并发的优势。
因此这种设计不是可扩展的。


设计二


1、在每个事务中处理一批元组。
如果是全局计数,一批元组的数量可以一次性地更新到数据库中。
2、如果批处理失败,就重发这一批失败的元组。
3、不能给每个元组一个事务 ID,而应该给一批元组一个事务 ID
4、而且各批次之间强有序。


看下图:

如果一个批次处理1000个元组,则对数据库的调用就比设计一减少了1000倍。另外,它也利用了storm的并发优势,因为一个批次的元组是可以并发处理的。

依然没有高效地利用资源。因为拓扑中的worker花费了很多时间在等待其他部分的计算完成。例如:

当bolt1完成了它的处理,它会等待其他的bolt的处理完成之后才可以接收到spout发送的下一批数据。

设计三(storm的设计)

一个关键的认知在于:在批处理中并不是所有的步骤都需要强有序

storm通过将一个批的计算划分为两步骤来实现:

  1. 处理阶段:这是可以并行处理很多批的阶段
  2. 提交阶段:该阶段是各批强有序的。如果批次1没有提交成功,是不会提交批次2的。

两步骤作为一个整体,称为“事务”。在一个给定的时刻很多批都在进行计算,但是只有一个批次处于提交阶段。不管是在处理阶段还是在提交阶段,如果一个批次的元组处理失败了,整个事务重新执行(两个阶段)。

设计细节

当使用事务拓扑的时候,storm进行如下处理:

  1. 管理状态:事务性拓扑的所有必须的状态都存储于Zookeeper中。包括当前的事务ID以及定义了每个批次参数的元数据。
  2. 事务调度:storm管理必要的所有数据以决定在任意一个时点哪个事务应该处于处理阶段还是提交阶段
  3. 错误检测:storm利用确认机制框架高效地确定一个批次是成功处理了、成功提交了,还是失败了。storm会恰当地进行重发。用户不需要做任何的确认或锚标记——storm来管理这一切。
  4. 一流的批处理API:storm在普通bolt之上设计了API用于元组的批处理。storm管理所有的调度以确认何时一个任务收到了某个事务的所有元组。storm也会清除或累加每个事务的状态(就像部分计数一样)。

最后,storm需要一个源队列以进行精确的消息批的重发。Apache Kafka就非常适合这种任务的spout,storm-kafka包含了Kafka事务性spout的具体实现。

事务拓扑API

bolt

在事务拓扑中存在三种bolt:

  1. BasicBolt:该bolt不处理批的元组,而仅仅是基于单个元组进行处理并发射。
  2. BatchBolt:该bolt处理批的元组。对每个元组调用execute方法,当一个批次处理完之后就调用finishBatch方法。
  3. 标记为提交器的bolt:该bolt和普通的bolt唯一的区别在于何时调用finishBatch方法。提交器的finishBatch方法在提交阶段调用。保证在提交阶段,所有前置的批都已经成功提交,并且当它提交成功,就完成了它的使命。两种方式将BatchBolt标记为提交器,要么实现ICommitter接口,要么在TransactionalTopologyBuilder中调用setCommitterBolt方法设置bolt。

处理阶段和提交阶段

为了区分提交阶段和处理阶段的差别,让我们看一个案例:

在该拓扑中,只有标记为红色的才是提交器。

在处理阶段,bolt A处理完spout发送的一个批的元组,调用finishBatch方法将它的元组发送给bolt B和Bolt C。Bolt B是一个提交器,因此它会调用execute方法来处理所有的元组但是不会调用finishBatch方法。Bolt C的finishBatch方法也不会调用,因为它不知道是否已经接收了所有来自B的元组(因为bolt B在等待事务提交)。最后,bolt D会接收通过调用C发送过来的任何元组。

只要不是提交事务,B不会调用finishBatch,C不是提交器,也不调用finishBatch,因为它不知道是否接收了B全部的元组。

当批提交的时候,调用B的finishBatch方法。一旦提交完成,C知道它已经接收了所有的元组并调用finishBatch方法。最后,D会接收到完成的批并调用finishBatch方法。

注意,D是一个提交器,当它接收了批的所有元组,不需要等待第二个提交的信号。因为它在提交阶段已经接收到了整个批的数据,直接提交并完成事务。

提交器bolt的行为和提交阶段的batch bolt很像。唯一的区别在于提交器在事务的处理阶段不会调用finishBatch方法。

确认

在事务拓扑中我们不需要做任何的确认和锚标记。

由storm管理。

确认策略进行了极大的优化。

事务的失败

当使用普通bolt的时候,可以调用OutputCollector的fail方法让整个元组树上的元组失败。由于事务拓扑隐藏了确认框架的细节,它们提供了一个不同的让批失败的方法。直接抛出FailedException。跟普通异常不同,该异常只会导致特定批失败并重发,不会让整个进程宕掉。

事务性spout

TransactionalSpout接口跟普通的Spout接口完全不同。TransactionalSpout的实现类发射元组的批,并且必须保证同批元组永远以相同的事务ID发射。

事务spout看起来像这样:

左边的调度器是storm一个普通的spout,当需要发射事务批元组的时候它会挨个儿发送元组。发射器的执行跟storm的bolt很像,负责发射批中的元组。发射器使用全分组订阅调度器的"batch emit"流。

TransactionalSpout在zookeeper中存储少量状态,用于对发出的元组进行幂等,即对于相同的事务id重发的时候要保证数据是一样的。如果获取不到一样的数据,可以使用非幂等事务spout。

分区事务spout

对于事务spout一个常见的情形是从跨多个队列的一组分区中读取消息。例如,这就是TransactionalKafkaSpout做的事情。IPartitionedTransactionalSpout自动执行管理每个分区的状态的簿记工作,以确保幂等可重放性。

配置

对于事务性拓扑有两个重要的配置:

  1. zookeeper:默认,事务拓扑在同一个zookeeper实例中保存状态信息以管理storm集群。可以通过"transactional.zookeeper.servers"和"transactional.zookeeper.port"配置zookeeper。
  2. 允许一次处理的批数量:必须设置一次处理几个批的限制数字。使用"topology.max.spout.pending"。如果不配置,默认是1。

数据流如何工作
    1. 事务spout是一个包含了调度器spout和发射器bolt的子拓扑。
    2. 调度器是一个并行度为1的普通spout。
    3. 发射器是一个并行度为P的bolt,使用全分组订阅调度器spout的"batch"流。
    4. 当调度器spout确认了事务应该进入处理阶段了,就发射包含TransactionalAttempt和元数据的事务元组到"batch"流。
    5. 由于使用了全分组,每个发射器都会接收到通知,知道该发射事务中它们自己部分的元组了
    6. 在整个拓扑中,storm自动管理锚标记和确认机制,以确认何时事务完成了处理阶段。这里的关键是“根元组由调度器创建”,如果处理成功了,调度器会接收到确认消息,如果不管什么原因处理不成功(失败或超时),则接收到"fail"。
    7. 如果处理阶段成功了,所有前置的事务也成功提交了,调度器发射一个包含了TransactionAttempt的元组给"commit"流。
    8. 所有提交的bolt通过全分组订阅提交流信息,因此它们会接收到一个什么时候发生提交的通知。
    9. 跟处理阶段一样,调度器使用确认框架确认提交阶段是否成功。如果收到ack,就在zookeeper中将该事务标记为已完成。

相关文章:

大数据-Storm流式框架(七)---Storm事务

storm 事务 需求 storm 对于保证消息处理,提供了最少一次的处理保证。最常见的问题是如果元组可以被 重发,可以用于计数吗?不会重复计数吗? strom0.7.0 引入了事务性拓扑的概念,可以保证消息仅被严格的处理一次。因此可…...

Kafka - 3.x Kafka消费者不完全指北

文章目录 Kafka消费模式Kakfa消费者工作流程消费者总体工作流程消费者组原理消费者组初始化流程消费者组详细消费流程 独立消费者案例(订阅主题)消费者重要参数 Kafka消费模式 Kafka的consumer采用pull(拉)模式从broker中读取数据…...

Gerrit | 重磅! 2.x 版本升级到 3.x 版本----转

Gerrit | 重磅! 2.x 版本升级到 3.x 版本 为什么要做版本升级? 2.x known bugs 重大问题不一一列举,这里仅仅是举几个例子: 安全或权限问题:普通用户能看到敏感数据,例如看到其他用户的 hashed api 密码&#xff0c…...

使用c++编程语言,用递归的方法求第n个斐波那契数,代码如下

#include<iostream> using namespace std;int fib_1(int n) {if (n < 1){return n;}return fib_1(n - 1) fib_1(n - 2); }int main() {cout << fib_1(6);return 0; }...

git config pull.rebase false

git pull 默认使用merge 可以使用 git pull --rebase 命令使用rebase 或者配置 git config pull.rebase true 使 git pull命令执行 git pull --rebase git config pull.rebase false 的作用是设置 Git 在执行 git pull 命令时默认使用 merge 而不是 rebase。 git pull 命…...

Spring面试题:(一)IoC,DI,AOP和BeanFactory,ApplicationContext

IoC&#xff0c;DI&#xff0c;AOP思想 IOC就是控制反转&#xff0c;是指创建对象的控制权的转移。以前创建对象的主动权和时机是由自己把控的&#xff0c;而现在这种权力转移到Spring容器中&#xff0c;并由容器根据配置文件去创建实例和管理各个实例之间的依赖关系。对象与对…...

RabbitMQ如何保证消息不丢失呢?

RabbitMQ 是一个流行的消息队列系统&#xff0c;用于在分布式应用程序之间传递消息。要确保消息不会丢失&#xff0c;可以采取以下一些措施&#xff1a; 持久化消息&#xff1a; RabbitMQ 允许你将消息标记为持久化的。这意味着消息将被写入磁盘&#xff0c;即使 RabbitMQ 服务…...

VR步进式漫游,轻松构建三维模型,带来展示新形式!

引言&#xff1a; 虚拟现实&#xff08;Virtual Reality&#xff0c;简称VR&#xff09;已经成为当今科技领域的一项创新力量&#xff0c;它正在逐渐渗透到不同的领域&#xff0c;其中步进式漫游是VR技术的一项重要应用&#xff0c;它能在各个行业的宣传中发挥重要作用。 一&a…...

英语——分享篇——常用人物身份

常用人物身份 家庭成员类 father 父亲 mother 母亲 grandmother&#xff08;外&#xff09;祖母 grandfather&#xff08;外&#xff09;祖父 son 儿子 daughter 女儿 uncle 叔叔&#xff0c;舅舅 aunt 婶母&#xff0c;舅母 brother 兄弟 sister 姐妹 nephew 侄子 niece…...

202310-宏基组学物种分析工具-MetaPhlAn4安装和使用方法-Anaconda3- centos9 stream

MetaPhlAn 4是一种基于DNA序列的微生物组分析工具&#xff0c;它能够从宏基因组测序数据中识别和分离微生物的组成。以下是安装和使用MetaPhlAn 4的步骤&#xff1a; 安装MetaPhlAn 4&#xff1a; 裸机环境&#xff0c;手动安装 1. 安装依赖项&#xff1a; MetaPhlAn 4需要…...

systrace/perfetto如何看surfaceflinger的vsync信号方法-android framework实战车载手机系统开发

背景&#xff1a; hi&#xff0c;粉丝朋友们&#xff1a; 大家好&#xff01;近期分享了surfaceflinger相关的一些blog&#xff0c;有同学就对相关的一些内容产生了一些疑问。 比如&#xff1a;vsync查看问题&#xff0c;即怎么才可以说是vsync到来了。 比如perfetto中surfac…...

一文带你彻底弄懂js事件循环(Event Loop)

JavaScript事件循环是JavaScript运行时环境中处理异步操作的机制。它允许JavaScript在执行同步代码的同时处理异步任务&#xff0c;以避免阻塞线程并提供更好的用户体验。 本文将在浏览器异步执行原理基础上带你彻底弄懂js的事件循环机制。 浏览器JS异步执行原理 js是单线程…...

数据结构与算法:二叉树之“堆排序”

目录 一、树概念及结构 二、二叉树树概念及结构 特殊的二叉树 三、堆的概念及结构 四、堆的创建 1、声明结构体 2、初始化 3、销毁 4、添加新元素 5、交换元素 6、向上调整 7、判断堆是否为空 8、移除堆顶元素 9、向下调整 10、获取堆元素个数 五、使用堆排序…...

gma 2 教程(三)坐标参考系统:2.基准面/椭球体

安装 gma&#xff1a;pip install gma 地球是一个近似于椭球体的三维物体&#xff0c;而地球上的各种测量和计算都需要一个基准面来进行。基准面是一个虚拟的平面&#xff0c;用于测量和计算地球上的各种物理量。在地球科学中&#xff0c;基准面通常是一个参考椭球体&#xff0…...

【1day】复现广联达-Linkworks 协同办公管理平台信息泄露漏洞

注:该文章来自作者日常学习笔记,请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与作者无关。 目录 一、漏洞描述 二、影响版本 三、资产测绘 四、漏洞复现...

Spring Cloud之ElasticSearch的学习【详细】

目录 ElasticSearch 正向索引与倒排索引 数据库与elasticsearch概念对比 安装ES、Kibana与分词器 分词器作用 自定义字典 拓展词库 禁用词库 索引库操作 Mapping属性 创建索引库 查询索引库 删除索引库 修改索引库 文档操作 新增文档 查找文档 修改文档 全量…...

vscode免密码认证ssh连接virtual box虚拟机

文章目录 安装软件virtual box配置vscode配置创建并传递密钥连接虚拟机最后 安装软件 安装vscode和virtual box&#xff0c;直接官网下载对应软件包&#xff0c;下载之后&#xff0c;点击执行&#xff0c;最后傻瓜式下一步安装即可 virtual box配置 创建一个仅主机网络的网卡 …...

【Linux】Centos yum源替换

YUM是基于RPM包管理&#xff0c;能够从指定的服务器自动下载RPM包并且安装&#xff0c;可以自动处理依赖性关系&#xff0c;并且一次安装所有依赖的软件包&#xff0c;无须繁琐地一次次下载、安装。 CentOS 8操作系统版本结束了生命周期&#xff08;EOL&#xff09;&#xff0…...

uniapp组件初始化的销毁(监听隐藏事件)

onHide是监听隐藏事件onHide() {console.log("销毁");this.clearTimer(); }, onShow(){console.log("初始化");this.getOrderInfo() },...

leetcode:1207. 独一无二的出现次数(python3解法)

难度&#xff1a;简单 给你一个整数数组 arr&#xff0c;请你帮忙统计数组中每个数的出现次数。 如果每个数的出现次数都是独一无二的&#xff0c;就返回 true&#xff1b;否则返回 false。 示例 1&#xff1a; 输入&#xff1a;arr [1,2,2,1,1,3] 输出&#xff1a;true 解释&…...

2023秋《论文写作》课程总结

2023秋《论文写作》课程总结 授课教师为闵帆教授&#xff0c;原文链接《论文写作》 文章目录 2023秋《论文写作》课程总结一、关于写作工具二、关于写作中的单词、短语、语法等三、关于论文题目四、关于摘要和关键词五、关于引言部分六、关于方法及实验部分七、关于结论八、关…...

Linux学习第27天:Platform设备驱动开发: 专注与分散

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 专注与分散是我在题目中着重说明的一个内容。这是今天我们要学习分离与分层概念的延伸。专注是说我们要专注某层驱动的开发&#xff0c;而对于其他层则是芯片厂商…...

最长公共子序列

题目描述 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些字符&#xf…...

万字解析设计模式之工厂方法模式与简单工厂模式

一、概述 1.1简介 在java中&#xff0c;万物皆对象&#xff0c;这些对象都需要创建&#xff0c;如果创建的时候直接new该对象&#xff0c;就会对该对象耦合严重&#xff0c;假如我们要更换对象&#xff0c;所有new对象的地方都需要修改一遍&#xff0c;这显然违背了软件设计的…...

One-to-N N-to-One: Two Advanced Backdoor Attacks Against Deep Learning Models

One-to-N & N-to-One: Two Advanced Backdoor Attacks Against Deep Learning Models----《一对N和N对一&#xff1a;针对深度学习模型的两种高级后门攻击》 1对N&#xff1a; 通过控制同一后门的不同强度触发多个后门 N对1&#xff1a; 只有当所有N个后门都满足时才会触发…...

洛谷 B2009 计算 (a+b)/c 的值 C++代码

目录 题目描述 AC Code 切记 题目描述 题目网址&#xff1a;计算 (ab)/c 的值 - 洛谷 AC Code #include<bits/stdc.h> using namespace std; int main() {int a,b,c;cin>>a>>b>>c;cout<<(ab)/c<<endl;return 0; } 切记 不要复制题…...

Arduino驱动ME007-ULA防水测距模组(超声波传感器)

目录 1、传感器特性 2、控制器和传感器连线图 3、驱动程序 3.1、读取串口数据...

Linux 权限管理(二)

文件类型和访问权限&#xff08;事物属性&#xff09; linux前都会有一串这个字符&#xff0c;第二字符到第九字符分别表示拥有者&#xff0c;所属组&#xff0c;和other所对应的权限。那么第一个字符表示什么呢&#xff1f; 第一个字符表示文件类型&#xff1a; d&#xff1a…...

线性代数 第一章 行列式

一、概念 不同行不同列元素乘积的代数和&#xff08;共n!项&#xff09; 二、性质 经转置行列式的值不变&#xff0c;即&#xff1b; 某行有公因数k&#xff0c;可把k提到行列式外。特别地&#xff0c;某行元素全为0&#xff0c;则行列式的值为0&#xff1b; 两行互换行列式…...

查询Oracle所有用户相关信息

$sqlplus / as sysdba 1. 查询oracle中所有用户信息 select * from dba_users; select * from all_users; select distinct owner from all_objects; 2. 只查询用户和密码 select username,password from dba_users; 3. 查询当前用户信息 select * from dba_ustats; 4…...