云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

_mysql数据库导出数据_怎么买

小七 141 0

Workers KV-Cloudflare的分布式数据库

今天,我们很高兴地宣布,工人KV正在进入通用状态,准备生产使用!什么是工人KV?Workers KV是一个高度分布、最终一致的关键价值存储,跨越了Cloudflare的全球优势。它允许您存储数十亿个键值对,并在世界任何地方以超低延迟读取它们。现在,您可以构建具有CDN静态性能的整个应用程序缓存。为什么我们造的吗?Workers是一个允许您在Cloudflare 175多个数据中心的全球边缘运行JavaScript的平台。只需几行代码,您就可以在没有源服务器的情况下路由HTTP请求、修改响应,甚至创建新的响应。//处理单个重定向的工作线程,//如此卑微的开始。。。addEventListener("获取",事件=>{事件响应(手动直接(事件请求))})异步函数handleOneRedirect(请求){let url=新url(请求.url)让设备=请求.headers.get("CF设备类型")//如果设备是移动设备,请在主机名上添加前缀。//(例如。example.com网站变成mobile.example.com网站)如果(设备==="移动"){url.主机名="移动。"+url.主机名返回响应.重定向(网址,302)}//否则,将请求发送到原始主机名。return wait fetch(请求)}客户很快就向我们提供了需要存储持久数据的用例。按照上面的例子,处理单个重定向很容易,但是如果您想处理数十亿个重定向呢?你必须将它们硬编码到你的Workers脚本中,把它们都放在1MB以下,并且每次你想做改变时都要重新部署它!这就是为什么我们建立了Workers KV//一个可以处理数十亿次重定向的工人,//现在更像是这样了!addEventListener("获取",事件=>{事件响应(方向盘车把(事件请求))})异步函数句柄重定向(请求){let prefix="/redirect"let url=新url(请求.url)//检查URL是否为特殊重定向。//(例如。example.com/redirect/)如果(url.pathname.startsWith(前缀){//重定向是您定义的自定义变量,//它绑定到Workers KV"namespace"。一个储水桶)let redirect=等待重定向.get(url.pathname.replace(前缀,"")如果(重定向){url.路径名=重定向返回响应.重定向(网址,302)}}//否则,将请求发送到原始路径。return wait fetch(请求)}与上一个示例相比,只做了一些更改,我们从一个重定向扩展到了数十亿—这只是一个尝试,您可以用工人构建什么千伏。怎么了有用吗?分布式数据存储通常使用CAP定理建模,该定理指出分布式系统只能从下面的3个g中选择2个保证:一致性-我的数据到处都一样吗?可用性-我的数据可以随时访问吗?分区容忍度-我的数据对区域性中断有弹性吗?工人KV选择保证可用性和分区容差。这种组合被称为最终一致性,它为KV工人提供了两个独特的竞争性a优点:阅读超快(中位数12毫秒),因为它由我们的缓存驱动技术。数据可跨175个以上的边缘数据中心提供,并可适应区域停电。不过,对最终的一致性有权衡。如果两个客户机同时向同一个键写入不同的值,最后一个写入的客户机最终"获胜",其值将全局一致。这也意味着,如果一个客户机写入一个键,而同一个客户机读取同一个键,则值可能在短时间内不一致时间到了有助于将这个场景形象化,下面是三个场景中的一个真实例子朋友们:假设马修,米歇尔和李正在计划他们的每周活动午餐。马修决定他们要出去寿司。马修告诉米歇尔他们的寿司计划,米歇尔同意。李,不知道计划,告诉米歇尔他们实际上披萨。安一个小时后,米歇尔和李在比萨店等着,而马修却独自坐在寿司店——出什么事了?我们可以把这归因于最终的一致性,因为在等了几分钟之后,马修查看了更新后的日历,最终发现了新的真相,他们要去吃披萨取而代之的是在现实生活中可能需要几分钟的时间,工人KV要快得多。它可以在不到60秒的时间内实现全局一致性。此外,当工作线程写入一个键,然后立即读取同一个键时,如果两个操作来自同一个操作,则可以期望值是一致的地点。什么时候我应该用吗?现在您已经了解了使用最终一致性的好处和利弊,那么如何确定它是否适合您的应用程序的存储解决方案?简单地说,如果你想要超快速读取的全球可用性,那么Workers KV是合适的你。不过,如果应用程序经常写入同一个密钥,则需要额外考虑。我们称之为"马修问题":世界上的马修斯偶尔会去错误的餐厅,你同意吗?您可以想象这样的用例(比如我们的redirect Worker示例),在这些用例中这不会产生任何实质性的区别。但是如果你决定跟踪用户的银行账户余额,你不会希望两个余额同时存在的可能性,因为他们可以用他们已经拥有的钱购买东西花了。什么我能用它造吗?下面是一些用KV构建的应用程序的例子:大规模重定向-处理数十亿个HTTP重定向。用户验证-验证用户对API.翻译键-动态地本地化你的网站页面。配置数据-管理谁可以访问您的起点.台阶函数-在多个API之间同步状态数据功能。边缘文件存储-承载大量的文件。我们'。我们还有一些更深入的代码演练,包括最近发布的一篇关于如何与员工一起构建在线待办事项列表的博客文章KV。什么从beta版开始是新的吗?到目前为止,我们最常见的要求是让数据更容易地写入KV工人。这就是为什么我们要发布三种新的方法来平衡这种体验更好:1。批量写入如果您想将现有数据导入Workers KV,您不想为每个键值对发送HTTP请求。这就是为什么我们向Cloudflare API添加了一个大容量端点。现在,您可以在一次输入中上载多达10000对(最多100 MB的数据)请求.curl"https://api.cloudflare.com/client/v4/accounts/\$ACCOUNT_ID/storage/kv/namespaces/$NAMESPACE_ID/bulk"\-X输出\-H"X-Auth-Key:$CLOUDFLARE_Auth_密钥"\-H"X-Auth-Email:$CLOUDFLARE_Auth_电子邮件"\-d'[{"key":"建筑商",值:"凯尔、亚历克斯、查理、安德鲁和布雷特"},{"key":"审查人",值:"joaquin"},{"key":"批准人",值:"steve"}]'让我们看一个示例用例:您希望将您的网站翻译下载给工人。由于您经常读取翻译键,并且只是偶尔更新它们,所以这个应用程序可以很好地与worker的最终一致性模型一起工作千伏英寸在这个例子中,我们钩住Crowdin,一个管理翻译数据的流行平台。这个Worker响应一个/translate端点,下载您的所有翻译键,并将它们批量写入Workers KV,以便您以后在我们的边缘:addEventListener("获取",事件=>{如果(event.request.url.pathname=="/translate"){事件响应(uploadTranslations())}})异步函数uploadTranslations(){//向crowdin索取我们所有的翻译。var response=等待获取("https://api.crowdin.com/api/project" +"/:ci_project_id/下载/全部.zip?密钥=:ci_secret_密钥")//如果crowdin正在响应,则将响应解析为//一个包含我们所有翻译的json。如果(回答。好) {var translations=await zipToJson(响应)return await bulkWrite(翻译)}//从crowdin返回错误的响应。返回响应}异步函数bulkWrite(keyValuePairs){取回("https://api.cloudflare.com/client/v4/accounts" +"/:cf_account_id/storage/kv/namespaces/:cf_namespace_id/bulk",{方法:"放置",标题:{"Content-Type":"应用程序/json","X-Auth-Key":":cf_Auth_-Key","X-Auth-Email":":cf\u电子邮件"},正文:JSON.stringify(键值对)})}异步函数zipToJson(响应){// ... 为简洁起见省略。。。//(例如。https://stuk.github.io/jszip)返回[{键:你好。恩,值:"Hello World"},{键:你好。ES,值:"Hola Mundo"}]}现在,当你想翻译一个页面时,你所要做的就是从Workers KV:async function translate(keys,lang)读取{//将翻译名称空间绑定到translations变量。返回答应。全部(键.map(键=>翻译.get(键+"."+lang)))}2过期键默认情况下,存储在Workers KV中的键值对永远有效。但是,有时您希望数据在一段时间后自动删除。这就是为什么我们要为写操作引入expiration和expirationTtloptions;//键在60秒后过期。命名空间.put("myKey","myValue",{expirationTtl:60})//如果UNIX历元在过去,则密钥过期。命名空间.put("myKey","myValue",{expiration:1247788800})#您还可以将密钥从Cloudflare API设置为过期。卷曲"https://api.cloudflare.com/client/v4/accounts/\$ACCOUNT_ID/storage/kv/namespaces/$NAMESPACE_ID/\值/$KEY?expiration_ttl=$expiration\u秒"-X输出\-H"X-Auth-Key:$CLOUDFLARE_Auth_密钥"\-H"X-Auth-Email:$CLOUDFLARE_Auth_电子邮件"\-d"$VALUE"假设你想阻止那些被标记为不适合你的网站的用户,但只能阻止一周。使用过期密钥,您可以设置过期时间,而不必担心删除它待会儿。进来在这个例子中,我们假设用户和IP地址是同一个。如果应用程序具有身份验证,则可以使用访问令牌作为密钥标识符.addEventListener("获取",事件=>{