我从在嵌入式键值存储上构建3个高流量Web应用程序中学到了什么。

我从在嵌入式键值存储上构建3个高流量Web应用程序中学到了什么。

我成长为一种时尚,即所有Web应用程序都必须建立在正确的体系结构上,这通常涉及到经过良好测试和稳定的sql数据库(如postgres),或者在某些情况下涉及nosql数据库(如mongodb)。 原因很简单:

  • 它们可以缩放,缩放和缩放。 当您的应用程序在一夜之间达到最初的10亿用户时,这一点非常重要。
  • SQL是访问数据的最佳方法。 而且,您始终需要一个复杂的消息层来访问该数据。
  • 如果您不使用sql,将如何执行联接? 您将如何构建复杂的搜索? 您将如何防止代码变得如此复杂以至于掉下来并杀死您的猫?
我从在嵌入式键值存储上构建3个高流量Web应用程序中学到了什么。
您的猫害怕您的代码。
  • 为什么在不需要雇用经验丰富的数据库管理员来创建复杂的架构并执行非常重要和复杂的数据库维护任务的情况下构建应用程序。

在2015年,我偶然发现了golang BoltDB数据库库 ,并首先用于将状态保存在基本服务器端应用程序中。 然后我偶然发现了blevesearch ,它突然出现在我身上。 大多数数据库提供的最基本的功能是存储,以及对存储数据的灵活搜索。 使用boltdb,我可以高效地存储数据,并且可以通过bleve以有趣的方式搜索和访问数据。

我从在嵌入式键值存储上构建3个高流量Web应用程序中学到了什么。
blevesearch

在此基础上,我仅在boltDB和blevesearch上构建并启动了Calabar Yellow Pages ,然后,当我看到它在生产中的运行和扩展情况时,我继续在badge DB(A上)构建Shop440 (Shopify和Aliexpress的合并)。比boltdb更快的替代方法)和blevesearch进行索引。

我学到了什么:

关键价值商店快速

首先,NoSQL键值存储速度快,比可比的关系数据库快得多。 它的速度来自其简单性。 键值数据库使用一个主键存储数据记录。 **意味着记录是唯一可识别的,并且可以直接访问。 除此之外,由开发人员来设计访问数据的更多复杂性。

我从在嵌入式键值存储上构建3个高流量Web应用程序中学到了什么。

另外,由于我使用的键值存储是嵌入式数据库,因此我能够进行一些较成熟的数据库附带的处理。 在像mongoDB这样的数据库中, 大量的资源和等待时间用于序列化数据并将其通过电线传递给客户端应用程序,然后由客户端对应用程序进行反序列化和解码 这是浪费资源,尤其是当客户端和数据库在同一服务器上运行时,而不是在单独的服务器上运行时,它们将从HTTP通讯中受益。 嵌入式数据库消除了所有这些额外的序列化甚至tcp传输成本。

出色的可扩展性-一致性如何?

其次,NoSQL键值数据库也是高度可伸缩的。 这也是其简单性的功能。 与关系数据库不同,NoSQL键值数据库没有义务垂直扩展。 它可以将多个机器或设备扩展几个数量级,而无需进行大量重新设计。 在财务上,这也是一大优势。

我从在嵌入式键值存储上构建3个高流量Web应用程序中学到了什么。

但就我而言,由于使用嵌入式键值存储,因此大多数扩展都是垂直发生的,甚至持续了很长时间。 目前,即使数据库大小接近TB,应用程序仍然保持强大的性能。 有了badge,我想到了拥有多个multiple数据库的策略,每个数据库代表一个集合。 这样,如果我需要将系统扩展到单个服务器之外,则可以将每个单独的数据库及其对应的程序逻辑隔离到一个单独的微服务中。 (我将在以后写更多有关此的内容。)

省时省力

我从在嵌入式键值存储上构建3个高流量Web应用程序中学到了什么。

扩展关系数据库解决方案通常意味着成本成比例增加。 它还需要时间和精力(以及服务器停机)来更改数据库架构。 相比之下,键值数据库使价格曲线保持线性而不是指数,并且设计为无需任何预定义架构即可处理数据。 某些(不是全部)键值数据库(如其他NoSQL数据库)也设计用于“ 最终一致性 ”。 这意味着数据“在某个时刻”在不同计算机上的副本之间同步,但不是立即同步。

无模式行和列

我从在嵌入式键值存储上构建3个高流量Web应用程序中学到了什么。

嵌入式键值存储的案例

根据https://www.sqlite.org/whentouse.html

对于大多数中低流量的网站(也就是说,大多数网站),SQLite可以很好地用作数据库引擎。 SQLite可以处理的网络流量取决于网站使用其数据库的程度。 一般来说,任何每天点击量少于10万的网站都可以在SQLite上正常运行。 每天10万次点击是一个保守的估计,而不是一个硬上限。 SQLite已被证明可以处理10倍的流量。
SQLite网站( https://www.sqlite.org/ )当然使用SQLite本身,截至撰写本文(2015)时,它每天处理约40万到500万HTTP请求,其中约15–20%是动态的页面接触数据库。 动态内容每个网页使用大约200条SQL语句 此设置在单个VM上运行,该VM与23个VM共享一台物理服务器,但大多数时候仍将平均负载保持在0.1以下。

大多数嵌入式**值存储区(例如badge)比sqlite的效率和性能要高得多,因此这可以证明,如果sqlite每天可以处理如此多的点击,则嵌入式**值存储区还可以提供更多的功能。

此外,使用嵌入式键值存储在旁边像编译语言像Blevesearch嵌入式索引引擎Golang ,意味着你可以真正没有外部的依赖,也不需要部署后的设置部署单一的二进制文件。

简而言之

嵌入式键值存储为您提供了nosql 数据库的所有优点,但是缺少它的地方在于搜索,因为您只能通过键和键的前缀来查询项目。 但是,当与诸如golang中的blevesearch或elasicsearch和lucene的索引引擎配对时,该配对将以非常节省资源的程序包为您提供功能强大的数据库,具有全文搜索,基于位置的搜索等功能,并且可以很好地扩展。

我相信这对服务器应该比目前实际拥有更多的知名度,并且在减少服务器费用方面要花很长时间,尤其是对于那些从未期望过Facebook级规模的应用程序。

From: https://hackernoon.com/what-i-learnt-from-building-3-high-traffic-web-applications-on-an-embedded-key-value-store-68d47249774f