如何升级我们的 short/long 内存项以进行实时处理

How to upgrade our short/long memory term for real time processing

我们的移动应用跟踪用户事件(事件可以有多种类型)

报告用户事件的每个移动设备都可以检索它。

我想到了写Redis和Mysql。

当用户请求时:

1. Find on Redis
2. If not on Redis find on Mysql
3. Return the value
4. Keep Redis modified in case value wasnt existed.
5. set expiry policy to each key on redis to avoid out of mem.

问题:

1. Reads: If many users at once requesting information which not existed at Redis  mysql going to be overloaded with Reads (latency).

2. Writes: I am going to have lots of writes into Mysql since every event going to be written to both datasources.

事实:

1. Expecting 10m concurrect users which writes and reads.
2. Need to serv each request with max latency of one second.
3. expecting to have couple of thousands requests per sec.

有什么解决方案可以让这种机制有好的qos?

3. Is that in any way Lambda architecture solution ? 

谢谢。

抱歉,此类(复杂)问题在这里很少有现成的答案。太多的未知数。你的预算是多少,你有多少硬件。由于有 1000 万客户同时使用您的服务,您的问题是关于硬件,而不是软件。

几个重要的要求这里就不多说了:

  1. 什么更重要 - 一致性 vs 可用性?
  2. read/write比率是多少

Read/write 比例要求

如果您有 10,000,000 个并发用户,这本身就是问题。但如果你有很多阅读,它并不像看起来那么可怕。在这种情况下,您应该注意 mysql 中的正确索引。还要购买具有大量 RAM 的服务器,以至少将索引数据保存在 RAM 中。因此,一台服务器可以在 1 秒内容纳 3000-5000 个并发 select 查询而不会出现任何延迟要求问题(我们的一个统计项目在 4 年的普通硬件上每台服务器最多可容纳 7,000 select rps)。

如果您有很多写入 - 一切都会变得更加复杂。一致性成为主要问题。

一致性与可用性

如果一致性很重要 - 去商店购买带有 SSD 驱动器和现代 CPU 的新服务器。不要忘记购买尽可能多的内存。为什么?如果您有很多写入请求,您的 sql 服务器将在每次写入时重建索引。而且您不能不使用索引,因为您的读取请求不会保持延迟要求。在一致性下,我的意思是——如果你写了一些东西,你应该在 1 秒内完成,如果你在写入后立即读取这些数据——你会在 1 秒内获得实际的书面信息。

您的问题1:

Reads: If many users at once requesting information which not existed at Redis mysql going to be overloaded with Reads (latency).

或众所周知的 "cache miss" 问题。它只有一些解决方案——水平缩放(购买更多硬件)或预缓存。这种情况下的预缓存至少可以在3种场景下完成:

  1. 使用非阻塞读取并等待最多一秒钟,而不会从 SQL 服务器查询数据。如果不是,则来自 Redis 的 return 数据。立即在 Redis 中更新或抛出队列 - 如您所愿。
  2. 尽可能快地使用blocking/non阻止从Redis读取和return数据,但是每次准备好的查询都会将jub推送到Redis中关于更新缓存数据的队列(也可能会通知应用程序它应该重新查询一段时间后的数据)。
  3. 总是 read/write 来自 Redis,但在队列中注册作业每个写入请求以更新 SQL 中的数据。

每一个都是妥协:

  1. 高可用但一致性差,Redis是LRU缓存。
  2. 高可用但一致性差,Redis是LRU缓存。
  3. 高可用性和一致性,但 Redis 需要大量 RAM。

Writes: I am going to have lots of writes into Mysql since every event going to be written to both datasources.

再次妥协。很多写入都依赖于硬件。因此,购买更多或使用队列来等待写入。所以再次可用性与一致性。

事件跟踪意味着(通常)您可以 return 接近实时但不是实时的数据。例如,更新磁盘上的数据 (mysql) 有 1-10 秒的延迟,为 write/read 服务请求保持 1 秒的延迟。 因此,它结合了 1/2/3(或其他一些)数据证明技术:

  • 在Redis中使用LRU,不要使用expire。很多过期键 - 问题是。所以我们不能用它来确保我们节省 RAM。
  • 使用队列预热 Redis 中丢失的键。
  • 使用队列从Redis服务器向mysql服务器写入数据。
  • 使用额外的请求来更新来自客户端的数据缓存丢失情况的大小。