我的一个朋友在一次采访中被问到这个问题。我想在这里讨论这个问题
这个问题的有效实施是什么?
我想到的一个简单的想法是普通的 memqueue ,使用 Memcache 机器来扩展多个请求,并运行一个消费者作业,它将内容从 memcache 写入 DB。稍后对于第二部分,我们可以运行一个 sql 查询来查找匹配订阅者的列表。
问题:-
事件被发布到这个系统。每个事件都可以被认为包含一个固定数量 (N) 的字符串列,称为 C1、C2、... CN。因此,每个事件都可以作为字符串数组传递(C1 是数组中的第 0 个元素,C2 是第一个元素,依此类推)。
有 M 个订阅者 – S1, … SM
每个订阅者注册一个谓词,指定它感兴趣的事件子集。每个谓词可以包含:
Equality clause on columns, for example: (C1 == “US”)
Conjunctions of such clauses, example:
(C1 == “IN”) && (C2 == “home.php”)
(C1 == “IN”) && (C2 == “search.php”) && (C3 == “nytimes.com”)
(在上面的例子中,C1 代表事件的国家代码,C2 代表网站的网页,C3 代表推荐人代码。)
IE。– 每个谓词都是一些相等条件的合取。请注意,谓词不一定对所有列都有相等子句(即,谓词可能不关心某些或所有列的值)。(在上面的示例中:#a 不关心列 C3,... CN)。
我们必须设计和编写一个 Dispatcher,它可以将传入的事件与注册的订阅者相匹配。传入事件的速率为每秒数百万。订阅者数以千计。所以这个调度器必须非常高效。简单来说:
When the system boots, all the subscribers register their predicates to the dispatcher
After this events start coming to the dispatcher
For each event, the dispatcher has to emit the id of the matching subscribers.
就接口规范而言,可以大致说明以下内容(用Java):
Class Dispatcher {
public Dispatcher(int N /* number of columns in each event – fixed up front */);
public void registerSubscriber( String subscriberId /* assume no conflicts */,
String predicate /* predicate for this subscriberid */);
public List<String> findMatchingIds(String[] event /* assume each event has N Strings */);
}
即:构造了调度程序,然后进行了一堆 registerSubscriber 调用。之后,我们不断调用 findMatchingIds() 方法,本练习的目标是使该函数尽可能高效。