责声明:本文旨在传递更多市场信息,不构成任何投资建议。文章仅代表作者观点,不代表MarsBit官方立场。
小编:记得关注哦
来源:MarsBit
11 月 13 日,Elon Musk为 Twitter 进行了 1000 多次RPC来呈现用户的主页时间线而道歉。乍一看,如此大量的 RPC 似乎很荒谬。如今,Twitter 每月为 2.6 亿活跃用户提供服务,并且可以近乎实时地提供服务。为了解决亚秒级延迟的大规模采用问题,Twitter 率先推出了许多解决方案,包括 Apache Storm、Heron、DistributedLog和Aurora。他是Scala 的主要贡献者,包括finagle RPC 框架,以及lambda 架构、Snowflake ID和Segcache等创新。那么,为什么像 Twitter 这样的创新型全球化公司需要如此多的调用来获取用户的时间线数据?
Twitter所面临的问题让我们想起了当前Web3中不断增长的烦恼:开发者常常被迫一个接一个地连续调用许多 API 来获取组装业务逻辑的数据。这会导致性能不可靠且不可预测,即使对于最简单的用例也是如此,例如获取用户的交易历史记录。就增长而言,前十大公链的交易量在两年内翻了 100 倍。在图 1 中,我们展示了每秒推文数量(2006-2013,蓝色)和每秒 Web3 交易数量(2017-2022,红色,排除非用户交易)之间的比较。如果 Web3 继续沿着图中描绘的轨迹发展,那么当今大多数 Web3 数据基础设施解决方案将无法应对增长。
图 1:推文与 Web3排名前10的链早期写流量 QPS 对比。
在这篇博文中,我们将重点介绍Web3可以从Twitter的扩展解决方案中学到什么。具体来说,我们讨论以下内容:
?我们概述了 Twitter 的时间线基础设施之旅,认为他们当前的架构确实对特定用例有意义,并得出结论,一些批评可能是错误的,例如 Elon Musk最近的推文为渲染主页时间线的大量 RPC 道歉。
?我们深入研究 Twitter 和 Web3 之间的技术相似性,并探索前者的解决方案如何使后者的解决方案受益。
?我们分析了当前的 Web3 增长趋势,以及缺乏现有的高性能数据基础设施解决方案,并得出结论,如果我们想要支持实时 Web3 数据访问,则需要进行重大升级,以及ZettaBlock解决方案如何帮助开发人员减少70%的开发时间,并将性能提高 10 倍,演示可以在这里找到 [网站,视频]
一开始,Twitter使用Vanilla MySQL。这很快成为了一个问题,因为在最初的几年里,推文的数量每年增长10倍。从2007年到2012年,Twitter的月活跃用户从几千人增长到超过1.38亿。已知的水平和垂直切分的知识无法为Twitter处理高流量的性能,尤其是在渲染主页时间线方面。
时间线是 Twitter 的主要平台功能之一。一般来说,Twitter的时间线主要有两个操作,具体如下:
1.写入路径:该路径用于用户发布推文。2012年,Twitter平均每秒处理4.6万个写入请求,在高峰时段处理1.2万个RPS。
2.读取路径:此路径用于用户请求他们的时间线。2012 年,Twitter 每秒处理大约 30 万次读取请求。
为了更好地理解 Twitter 如何呈现时间线,让我们更深入地研究呈现流程,如图 2 所示。当 Twitter 用户今天发布一条推文时,Twitter 首先将其写入Manhattan,一个分布式键值数据库,用于存储用户推文、直接消息、帐户详细信息等。该推文在时间线缓存中向该用户的所有关注者展开。虽然这将写入放大从每秒 4.6k 请求增加到每秒 345k 请求,但它也大大降低了用户的读取延迟。因此,时间线渲染不是在关注者和推文之间做一个连接表,而是从缓存中的单个表中获取推文。这些操作通常在不到 5 秒的时间内完成。通过分布正在写入的数据,系统可以通过删除表连接来避免过度增长。因此,读取延迟被改进到几百毫秒。
图 2:Twitter 的时间线渲染流程。请注意,时间线中的每条推文都需要至少一个 RPC。
前面提到的渲染流程对于绝大多数用户来说可能已经足够了(在大多数情况下写入放大值
图 3:左侧描绘了 Twitter 用户混合时间线的抽象说明,右侧描绘了相应的读取 SQL。
既然我们已经描述了提供实时推文时间线背后的复杂性,那么为什么单个时间线渲染需要许多 RPC 就很清楚了。例如,对于只有 100 条推文的时间线,RPC 调用很容易超过 1000 次,因为仅仅获取一条推文就需要多次RPC调用。该解决方案乍一看可能并不直观,但它是一种经过深思熟虑的权衡,旨在为最终用户提供优化且可预测的读取性能。
Twitter 实现的最终结果非常积极:99%的延迟只有几百毫秒左右。在过去的 10 年里,这种基础架构已经被证明是可靠的,可以在没有重大变化的情况下处理Twitter流量的高速增长。
请注意,我们忽略了Twitter时间线的其他方面,包括评分、排名等。有关这方面的更多详细信息,请参阅本文末尾列出的参考资料。
图 4:Twitter 和 Web3 数据的相似之处
Twitter 和 Web3 生态系统有很多相似之处:
1.Web3是一个社交图谱,推文类似于交易,回复类似于日志。图4描述了这一点,其中比较了顺序时间线渲染和顺序区块链的块。
2.Web3 协议和 Twitter 存在超级中心效应。最受欢迎的NFT平台的交易量是第10个平台的1000倍。
3.Web3 和 twitter 都是开放平台,对所有用户可见,并允许某些 API 访问。
如果我们放大一点,Twitter 和 Web3 之间的数据访问模式有更多相似之处:
1.读取量大,但每条记录很小。在 EVM 链上,日志和交易的平均大小只有几KB。
2.最新数据将被更频繁地查看,其中大部分查看来自发布后的前几个小时。
3.数据在短时间是不可变的。链上数据可以通过reorg恢复最新的区块。同样,现在用户可以在发布后的一段时间内编辑推文。
与 2020 年初相比,前 10 大链的交易量已经增长了近 100 倍。Web3 数据基础设施的现状类似于 2008 年前后的 Twitter 早期,当时大部分流量依赖于来自不同提供商的水平分片数据库。因此,随着 Web3 的持续增长,现有的 Web3 数据基础设施将很难提供对数据的高性能访问。
来自 Twitter 的扇出服务是将相关数据同时放在同一位置(如内存)。这样,当一个请求到来时,系统可以很容易地在一个地方找到相关数据,这导致数据已经被预处理并可以使用。这使得系统具有可扩展性,和可预测的性能。
遵循当前现状的 Web3 应用程序缺少一个重要的组件来有效地聚合相关数据。具体来说,开发者必须一个一个地调用API来获取数据。即使对于最简单的用例,例如获取用户的交易历史记录(如图 5 所示),这也会导致性能不可靠且不可预测。
图 5:当前的 Web3 应用程序需要如何连续调用许多不同的 API,即使是简单的事务聚合。
由于所有 Web3 数据都是公开可用的,ZettaBlock 构建了最先进的数据基础设施来处理所有 Web3 开发人员的扇出部分。应用程序开发人员只需通过一个 API 指定他们想要查询哪些相关数据,然后让 ZettaBlock 聚合所有相关数据。如图 6 所示。通过使用 ZettaBlock,开发时间和 API 延迟分别减少了 70% 和 90%。在https://demo.zettablock.dev/查看我们的演示。更多的技术细节将在未来分享。
图 6:与图 5 相比,ZettaBlock 将多个 Web3 数据集抽象为一个简单、用户友好且高效的API。
在这篇博文中,我们剖析了 Twitter 的架构,并将其数据模型与 Web3 进行了比较,发现了许多相似之处。如果我们能得到一个信息,那就是许多现有的 Web3 数据基础设施解决方案,就像早期的 Twitter 一样,将无法跟上即将到来的数据需求。
这就是我们构建 ZettaBlock 的原因。ZettaBlock 是一个全栈式 Web3 数据基础设施平台,可提供实时、可靠的 API 和分析,在几分钟内为您的应用程序提供支持。前面提到的扇出过程(将相关数据同时放在同一个地方),这只是 ZettaBlock 上开发人员和企业可用的众多功能之一。我们受到领先的web3公司的信任,如Polygon, Crypto.com, Circle等。我们的愿景是成为web3数据基础设施的首选平台。
请查看我们的演示/视频了解详细信息。
鸣谢
我想借此机会向所有在这篇文章中帮助过我的人表示衷心的感谢。特别感谢Kevin Ros、Chi Zhang、Maria Adamjee、Raphael Serrano、Zhenzhong Xu、Paul Tluczek、Tianzhou Chen、Hemanth Soni、Nitish Sharma、Ryan Kim、Alex Xu、Vivek Gopalan、Nazih Kalo、Nirmal Krishnan、Timothy Chen、Min Hao、Bo Yang
1.Timelines at Scale:
https://www.infoq.com/presentations/Twitter-Timeline-Scalability/
2.How Twitter uses redis to scale 105TB RAM:
http://highscalability.com/blog/2014/9/8/how-twitter-uses-redis-to-scale-105tb-ram-39mm-qps-10000-ins.html
3.What Database does Twitter use?
https://scaleyourapp.com/what-database-does-twitter-use-a-deep-dive/
4.Twitter Data Storage and Processing:
https://ankush-chavan.medium.com/twitter-data-storage-and-processing-dd13fd0fdb30#:~:text=That%20equals%20to%20the%2084,time%20the%20request%20is%20made
责任编辑:Kate
检察长大人 ins 传送门
几年前我就用 python 写过一版 instagram 爬虫,当时能做到下载我收藏的图片到本机。后来某天不能用了,调试后发现是 instagram 修改了登录接口的数据格式,导致爬虫无法登录,也就不能下载图片了
最近我在 github 上找了几个 instagram 爬虫的代码,很幸运的在 instaloader 里找到了登录 instagram 的正确数据格式,基于在个人博客上展示的需求,重新开发了爬虫
注意:instagram 会监控用户的行为,如果你的两次访问之间间隔太快,或者调用接口次数太多,会冻结你的访问,此时接口会返回 429 状态码,大概要等 24 小时才会解冻
我的解决方案是在两次访问之间随机休眠 2——4 秒,而且每 15 次访问额外休眠 60——90 秒,这样触发冻结的概率比较小
爬虫代码我近期会整理脱敏后开源到 github,请关注
NataLee:360 度无死角,完美的性感女神
makenzie_raine: 青春洋溢,美少女
theanastasiah: hotter than your ex better than your next, 很符合国人审美的俄罗斯模特
nicolaca_: YOU NEVER LOSE. EITHER YOU WIN or YOU LEARN. 来自德国的模特
realbarbarapalvin: 维密超模
所谓超文本,有2层含义:
标题标签 <hx></hx>
段落标签 <p></p>
水平线标签 <hr />
换行标签 <br/>
无语义标签 <div></div> 和 <span></span> 注:这两个标签在后期经常使用文本格式化标签
<b></b>和<strong></strong> 文字加粗
<i></i>和<em></em> 斜体
<s></s>和<del></del> 加删除线
<u></u>和<ins></ins> 加下划线图片标签
<img src="图像URL" /> src 图像路径 图像标签 <img src="图像URL" /> 该语法中src属性用于指定图像文件的路径和文件名,他是img标签的必需属性。
属性:
alt 文本,图像不显示时显示文字<img src="" alt="">
title 文本,鼠标悬停时显示内容<img src="cz.jpg" title="文本" />
width 图像宽度<img src="cz.jpg" width="300" height="300" />
height 图像高度<img src="cz.jpg" width="300" height="300" />
border 设置图像边框宽度<img src="cz.jpg" border="3" />
链接标签
<a href="#" target="目标窗口的弹出方式">文本或图像</a>属性:
href (链接地址)必须写 | 用于指定链接目标的url地址,(必须属性)当为标签应用href属性时,它就具有了超链接的功能 | 1. 外部链接 需要添加 http:// www.baidu.com | ||
target (默认当前窗口打开,可新建窗口打开) | 用于指定链接页面的打开方式,其取值有self和blank两种,其中_self为默认值,__blank为在新窗口中打开方式。 |
锚点标签
id="" | 锚点定位 | 通过创建锚点链接,用户能够快速定位到目标内容。 | <h3 id="two">第2集</h3> | 使用相应的id名标注跳转目标的位置。 (找目标) |
base标签
<base target="_blank" /> | base 可以设置整体链接的打开状态 | base 写到 <head> </head> 之间 |
预格式化标签
<pre>文本</pre> | 标签可定义预格式化的文本。 | 所谓的预格式化文本就是 ,按照我们预先写好的文字格式来显示页面, 保留空格和换行等。 |
表格标签
<table> 定义表格标签 | border | 设置表格边框(默认border="0"无边框) | <table> |
cellspacing | 设置单元格与单元格之间的空白间距 (默认2像素) | ||
cellpadding | 设置单元格内容与单元格边框之间的空白间距 (默认1像素) | ||
width | 设置表格的宽度 | ||
height | 设置表格的高度 | ||
align | 设置表格在网页中的水平对齐方式 (三个属性:left左 center中 right右 ) | align="center" align="right" | |
caption | caption 元素定义表格标题,通常这个标题会被居中且显示于表格之上。 | <caption>个人信息表</caption> | |
rowspan="合并单元格的个数" | 跨行合并 | 合并的顺序我们按照 先上 后下 先左 后右 的顺序 | |
colspan="合并单元格的个数" | 跨列合并 | <td colspan="3"> </td> | |
<caption></caption> | 表格标题标签 | ||
<tr></tr><td></td> | 标签,他就像一个容器,可以容纳所有的元素 | <tr><td></td></tr> | |
<th><td> | 一般表头单元格位于表格的第一行或第一列,并且文本加粗居中 | <th><td></td></th> | |
<thead> 于定义表格的头部。用来放标题之类的东西。<thead> 内部必须拥有 <tr> 标签! | 以上标签都是放到table标签中。 | 更好的给表格划分结构 | |
<tbody> 用于定义表格的主体。放数据本体 。 | 以上标签都是放到table标签中。 | ||
<tfoot>放表格的脚注之类。 | 以上标签都是放到table标签中。 |
列表标签
列表(ul里面只能包含li ,li里面可以包含标签) | <ul><li></li></ul> | 无序列表 | 1. <ul></ul>中只能嵌套<li></li>,直接在<ul></ul>标签中输入其他标签或者文字的做法是不被允许的。 | 里面只能包含li 没有顺序,我们以后布局中最常用的列表 | ||
<ol><li></li></ol> | 有序列表 | 所有特性基本与ul 一致。 但是实际中比 无序列表 用的少很多。 | 里面只能包含li 有顺序, 使用情况较少 | |||
<dl> | 自定义列表 | 里面有2个兄弟, dt 和 dd |
input控件
<input type="属性值" value="你好"> | text | 单行文本输入框 | |
password | 密码输入框 | ||
radio | 单选按钮 | ||
checkbox | 复选按钮 | ||
button | 普通按钮 | ||
submit | 提交按钮 | ||
reset | 重置按钮 | ||
image | 图像形式的提交按钮 | ||
file | 文本域 | ||
name | 由用户自定义 | 控件的名称 | 用户名:<input type="text" name=“username” /> |
value | 由用户自定义 | input控件中的默认问本值 | 用户名:<input type="text" name="username" value="请输入用户名"> |
size | 正整数 | input控件在页面中的显示宽度 | |
checked 默认被选中 | checked | 定义选择控件默认被选中的项 | <input type="radio" name="sex" value="女" />女 |
maxlength | 正整数 | 控件允许输入的最多字符数 |
<label> </label>
<label> 用户名: <input type="radio" name="usename" value="请输入用户名"> </label> | 第一种用法就是用label直接包括input表单。 | 当我们鼠标点击 label标签里面的文字时, 光标会定位到指定的表单里面 | |
<label for="sex">男</label> | 第二种用法 for 属性规定 label 与哪个表单元素绑定。 | 当我们鼠标点击 label标签里面的文字时, 光标会定位到指定的表单里面 |
文本域
<textarea >文本内容</textarea> | 通过textarea控件可以轻松地创建多行文本输入框. | cols="每行中的字符数" rows="显示的行数" 我们实际开发不用 | <textarea > 文本内容</textarea> |
select下拉列表
<select> | 在option 中定义selected=" selected "时,当前项即为默认选中项。 |
form表单域
<form action="url地址" method="提交方式" name="表单名称"> | action 属性值:url地址 | 用于指定接收并处理表单数据的服务器程序的url地址。 |
method 属性值:get/post | 用于设置表单数据的提交方式,其取值为get或post。 | |
name 属性值:名称 | 用于指定表单的名称,以区分同一个页面中的多个表单。 |
以上标签基本包含了前端开发所需常用标签.来自本人,黑马程序员.传智播客学习笔记.
以下是个人笔记整理,需要请关注私信我.
希望本人笔记能对各位有所帮助.
前端不难,难的在于东西多和杂.每天努力学习一点点,不放弃.
*请认真填写需求信息,我们会在24小时内与您取得联系。