当前位置 :首页 >> 情感

Discord怎样打印数十亿条消息?

2024-01-27   来源 : 情感

ataStax的全力支持,但仍然是Apache和一个社区驱动的。

继续得出结论选择后,我们只能断定我们选择的确是对的。

图表模型

将Cassandra为上新手描述的最佳形式是它是KKV打印。两个K最主要标识符。第一个K是南区共价键,用于明确图表所在的路由以及闪存上的位置。南区之前相关联多个行,南区之前的行由第二个K标识,第二个K是一个大key。大群key既充当南区之前的标识符,又充当行的加权形式。您可以将南区视为并行字典。紧密结合这些也就是感叹可理论上极为薄弱的图表建模。

你还回忆起我们之前可用channel_id和created_at在MongoDB之前检索第一时间? channel_id视为南区共价键,因为所有搜索都在一个通道上试运行,但created_at没视为一个最好的一个大共价键,因为两个第一时间可以带有不同的创建几周。幸运的是,Discord上的每个ID严格来说都是Snowflake算法作用于的(按几周顺序加权),所以我们可以可用它们。标识符转成(channel_id,message_id),其之前message_id是Snowflake。这理论上在调用channel 时,我们可以准确地去找Cassandra扫瞄第一时间的范围内。

这是我们的第一时间表的简化形式也(这替换成了大大约10至多)

CREATE TABLE messages ( channel_id bigint, message_id bigint, author_id bigint, content text, PRIMARY KEY (channel_id, message_id)) WITH CLUSTERING ORDER BY (message_id DESC);

Cassandra的Schemas 与关联文档不同,它们的扭曲成本很高昂,并且不时会对临时性能产生任何不良影响。我们给予了最好的blob打印和关联打印。

当我们开始将原先第一时间导入Cassandra时,我们立即在日志之前看到警告,去找我们南区的尺寸将近100MB。发生什么事了?! Cassandra据称它可以全力支持2GB南区!似乎,只能只能因为它可以进行,它并不理论上它应该。在传输,一个大扩展等过程之前,大型南区时会对Cassandra致使不大的GC阻碍。占有大南区也理论上其之前的图表无法在大群之前分布。很明显,我们必均需以某种形式限制南区的尺寸,因为单个Discord通道可以不存在多年并且不断增大。

我们最终按几周打印我们的第一时间。我们查看了Discord上最大的channel(电视网),并明确我们是否在一个打印桶之前打印了大大约10天的第一时间,我们可以轻而易举地维持在100MB都有。打印桶必均需可以从message_id或几周砍之前导出。

DISCORD_EPOCH = 1420070400000BUCKET_SIZE = 1000 * 60 * 60 * 24 * 10def make_bucket(snowflake): if snowflake is None: timestamp = int(time.time() * 1000) - DISCORD_EPOCH else: # When a Snowflake is created it contains the number of # seconds since the DISCORD_EPOCH. timestamp = snowflake_id>> 22 return int(timestamp / BUCKET_SIZE) def make_buckets(start_id, end_id=None): return range(make_bucket(start_id), make_bucket(end_id) + 1)

Cassandra南区共价键可以组合,因此我们的上新标识符转成((channel_id,bucket),message_id)。

CREATE TABLE messages ( channel_id bigint, bucket int, message_id bigint, author_id bigint, content text, PRIMARY KEY ((channel_id, bucket), message_id)) WITH CLUSTERING ORDER BY (message_id DESC);

为了搜索电视网之前的最近第一时间,我们作用于从这两项几周到channel_id的桶范围内(它也是Snowflake ID并且必均需比第一条第一时间格外旧)。然后我们共五搜索南区,直到整理到所均需的第一时间。这种方法的不同之处是很少有文艺活动的Discords必均需搜索多个桶以随几周整理所均需的第一时间。局限性,这被断定是好的,因为对于文艺活动的Discords,举例来说在第一个南区之前发现所均需的第一时间,并且它们占大多数。

将第一时间导入Cassandra顺利顺利进行,我们已作准备投入同月可用。

Dark LaunchDark Launch是Fackbook可用的一种测试系至多产品上新模组的测试方法。

将上新系统引入生产线总是很可怕,所以尝试在不不良影响普通用户的上述情况下顺利进行测试是个好主意。我们设立编码以对MongoDB和Cassandra顺利进行双重读/写下可用。 启动后我们立即开始在缺失搜索器之前发出缺失,去找我们author_id为空。怎么时会是null?这是一个必填字段!

事与愿违连续性

Cassandra是一个AP文档,这理论上它可以透过薄弱的可用性连续性,这是我们想尽办法的。它是Cassandra之前的read-before-write(擦除格外价格昂贵)的反形式也,因此即使你只透过某些至多,Cassandra所继续做的一切本质上都是一个upsert。您还可以载入任何路由,它将可用每至多的“last write wins”上下文来操作者解决暴力事件。那我们时会巧遇坑么?

Example of edit/delete race condition

在普通用户同时出版人第一时间而另一个普通用户删减不同第一时间的上述情况下,我们事与愿违给予的行缺少除标识符和译文之外的所有图表,因为所有Cassandra载入都是upserts。处理形式此关共价键问题有两种这样一来的解决方案:

出版人第一时间时写下回整个第一时间。这有这样一来恢复被删减的第一时间,并为并发载入其他至多的暴力事件上升格外多机时会。弄清楚该第一时间是不是表并从文档之前删减它。

我们选择了第二个配置文件,通过选择所均需的至多(在本例之前为author_id)并删减第一时间(如果该至多作NULL)来理论上。

在解决这个关共价键问题时,我们感叹明了我们的载入准确度极为低。由于Cassandra事与愿违是保持一致的,它不能立即删减图表。它必均需将删减存储其他路由,即使其他路由暂时必定用也要执行此可用。 Cassandra通过将删减视为一种称为“墓冢”的载入形式来理论上这一点。在阅读时,它只是翻过它巧遇的墓冢。'墓冢' 在配置的几周内(默普遍认为10天)不存在,并且在该几周到期时时会在执行传输可用后被永久删减。

删减至多或将NULL载入至多里他们效果完全不同,他们都时会作用于墓冢。由于Cassandra之前的所有载入都是upserts,这理论上即使在第一次载入NULL时,您也时会作用于一个上下文删减。严格来说,我们的整个第一时间Schema相关联16至多,但超过第一时间只设立了4个值。这样我们大部分几周都无缘无故地向Cassandra写下了12个墓冢。解决方案很有趣:只向Cassandra载入非空值。

性能

众所周知,Cassandra的载入速率比擦除速率快,我们确实仔细观察到了这一点。载入是亚毫秒,擦除几周勉强5毫秒。我们仔细观察到这一点,无论访问什么图表,并且在一周的测试在此期间性能维持保持一致。没什么令人震惊吃惊的,和我们在短期内效果差不多。

Read/Write Latency via Datadog

为了理论上短时间、保持一致的擦除性能,都有是在相关联数百万条第一时间的通道之前翻转到一年多前的第一时间的示例:

Jumping back one full year of chat

一个大兴奋

一切顺利,所以我们将其作为主要文档热卖,并在一周内逐步淘汰MongoDB。它暂时近乎地管理工作......大大约6个月末,直到竟然Cassandra加成变得很不快。

我们感叹明了Cassandra平常试运行10秒“stop-the-world” GC,但我们不明白为什么。我们开始数据分析并发现一个耗时20秒的Discord电视网。由于它是公开的,我们加入它看看上述情况。令我们吃惊的是,该电视网只有一条第一时间。就在那一刻,很明显他们可用我们的API删减了数百万条第一时间,在电视网之前只留下了一条第一时间。

如果您一直在注目,您这样一来还回忆起Cassandra如何可用墓冢处理形式删减(在事与愿违连续性之前提到)。当普通用户调用此电视网时,即使只有一条第一时间,Cassandra也必均需有效率扫瞄数百万条第一时间(注:Cassandra擦除到第一时间到再和墓冢里的Delete第一时间顺利进行合并可用,如果墓冢里的Delete可用有成千上万那么他合并可用就时会有点费时)上下文删减(作用于垃圾的速率比JVM可以整理的速率快)。

我们通过都有形式解决了这个关共价键问题:

我们将墓冢的寿命从10天延长到2天,因为我们每天中午在我们的第一时间一个大上顺利进行Cassandra整修(repair可用,他时会顺利进行传输可用)。我们格外改了搜索编码以搜索空打印桶并在将来的电视网之前可能会可用它们。 这理论上,如果普通用户再次引起此搜索,那么在最坏的上述情况下,Cassandra 将只能在最近的打印桶之前顺利进行扫瞄。未来

我们在此之前正在试运行一个原稿q为 3 的 12 路由一个大,并将根据只能暂时替换成上新 Cassandra 路由。 我们似乎这将过后几周一段几周,但随着 Discord 的不断下降,在遥远的未来我们每天时会打印数十亿条第一时间。 Netflix 和 Apple 试运行着由数百个路由分成的一个大,因此我们明白我们可以在一段几周内严厉批评顺利进行以致于理性。 然而,我们渴望对未来有一些想要。

短期:

将我们的第一时间一个大从 Cassandra 2 升级到 Cassandra 3。Cassandra 3 带有上新打印播放器,可以将打印尺寸缩减 50% 以上。最上新版的 Cassandra 格外擅长在单个路由上处理形式格外多图表。 在此之前我们在每个路由上打印了近 1TB 的传输图表。 我们似乎,通过将其上升到 2TB,我们可以安全地缩减一个大之前的路由数目。

长期以来:

可用 Scylla 顺利进行揭示,这是一个用 C++ 改写下的接口 Cassandra 的文档。 在正常可用在此期间,我们的 Cassandra 路由严格来说并没可用太多的 CPU,但是在非高峰周日,当我们试运行整修(an anti-entropy process)时,它们时会相当受 CPU 限制,并且过后几周随着自都只整修以来载入的图表量而上升。 Scylla 据称整修几周显着延长。重构一个的系统,将未可用的电视网录入到 Google Cloud Storage 上的Flat文件之前,并按均需调用它们。 我们想可能会这样继续做,也不普遍认为我们必均需这样继续做。论点

自从我们顺利进行变换以来并未即使如此了一年多,尽管“出乎意料”,但它一帆风顺。我们从处理形式总量为1亿条第一时间到每天将近1.2亿条第一时间,性能和准确度维持最好。由于该项目的尝试,我们已将支线上的图表移至Cassandra,这也赢取了尝试。后续我们将深入探讨如何使数十亿条第一时间可搜索。

来源:

郭卉
昆明治疗早泄医院
用英太青凝胶的禁忌有哪些
英太青效果好还是迪根效果好
兰州看男科哪里好
为应对油价偏低 优步(UBER.US)在美国推出燃油附加费

智通财经APP知悉,当地时间周五,优步UBER.US声称,从3月底16日起,将对除芝加哥外的美国消费者征税燃油加价,以降低原油价格飙升对计程车的冲击。该公司声称,上车每次乘坐优...

友情链接