Design Blacklist service

给一个 isMaliciousIP api, design a system to catch malicious IP

如何ban掉一些 malicious ip address, 问了很多data partition, table design,sql no sql的问题,staff问的

Design Blacklist service, 提供一个isMalicious(ip)的API,设计系统防止恶意攻击。主要难点在于sync各个server的blacklist,initialize new added server…

functional/non-functional requirements 假设一天1Billion访问量,5%是malicious ip造成的,估算下QPS和storage‍‌‌‌‍‌‍‍‍‍‌‍‍‍‍‍‌‌‍‍,可以跟面试官negotiate. High level LB layer, app server layer 然后request manager,ip要是没见过直接调用api,然后存进数据库。

请问老师,这个有什么大概思路或者设计图嘛?非常感谢

1 个赞

这道题的 non-functional requirement 跟 ratelimiter 比较像,需要比较高的性能,因为每个 request 都要过一遍这个 API,所以不想额外加太多的延迟。
系统的核心就是存储一个黑名单,一旦 isMalicious 返回 true,就加进黑名单。处理 request 的时候发现在黑名单就直接 block request,否则 call isMalicious API。
这个黑名单用 noSQL DB 来满足较高的读写 QPS(读大于写),用 master-slave 或者 consistent hashing,enable cross-region replication。同时用 LRU Query Cache,对于常见的坏IP就直接在 Cache 里读就可以了。

多谢,那问题来了。request来的时候是先过API还是先去cache或者databse去检查呢?
我的理解是先查cache,没有的再去API,更新cache,如果这里只用Redis是否可以嘛?要不然就要用cache write through,这样保证cache的数据总是最新的,另外用那个noSQL呢

你可以把 Cache + DB 考虑成一个整体,我倾向于使用 Write-back Cache,因为性能优先于一致性。只用 Redis 有更高的丢数据的危险。
DB 使用 Wide-column(比如 Cassandra)或者 persistent key-value store (比如 RocksDB) 都可以。

  1. 如果在Gateway处理黑名单,需要画多个Gateway么?
  2. 感觉data model没什么内容: IP + black time,需要补充写什么?
  3. partition:直接按IP范围么?是否可以按data center(怎么标识data center)?
    4.是否需要加布隆过滤器?感觉不需要,因为可以直接索引IP。
  4. 有人提到用kafaka+Mapreduce,感觉这个不靠谱
  1. Gateway 肯定是需要多个的,所以可以画多个。
  2. Redis 我觉得就存 IP 就可以了,如果每隔一段时间需要重新更新 blacklist 的话就再存一下 last_check_time
  3. 按照 IP partition,每个 data center 都存一份完整数据
  4. 不需要
  5. 不靠谱

谢谢老师的及时回复!

您好,问个小细节,请问cache+DB的worflow是怎样进行的?如楼上所说如果request先去cache如果cache没有再call api再更新cache,这个流程走下来好像没DB什么事啊

Cache 收到更新以后会 async 写到 DB。一旦 Cache 当机了,会用 DB 里的版本恢复。

想问下老师,这个high level design图里的Denylist lib的主要是用来做什么的?感觉整个flow都用不到

Denylist Lib 确实不需要。不太确定 @Li_Fuxian 是什么意图。

请问如果有LRU cache,对于已经在db存入过的但并不是最近使用过的ip,我们需要再去call api吗?

我想的流程是这样的:

if ( ip is in cache) {
     return true/ false;
} else if(ip is in db) {
    reutrn true/ false
} else {
    call API;
    Async update cache & db;
    return true
}
  1. 先去cache查,查到即返回
  2. cache没有去db查,查到返回
  3. db没有就直接放行,然后callAPI,异步更新cache和数据库

请老师评价一下 谢谢!

请问途中agent指代什么?

可以这么考虑。Agent 含义我也不清楚,图不是我画的,我猜就是个 service 的意思。

@logic 大神,请问怎么让其他cluster和同cluster的其他机器知道,有新的ip加入了呢? 是统一通过黑名单对吗?直接去查找nosql db?谢谢

直接写 noSQL DB

请问老师,blacklist和rate limiter最主要的区别是什么?我的理解对吗:

  • rate limiter需要用cache存每一个ip对应的bucket状态,不需要persist
  • blacklist用cache存总的black ip list,需要persist。可能要考虑cache和db data inconsistency的问题,也可以提到DB sharding, hot partition, consistent hashing, replication。可以再提一下cache invalidation?

这个全吗?有别的可以扩展的点吗?

已经很全了。Cache Invalidation 好像用不到吧,assuming black list 只增不减。