假设您使用您的卡在超市付款。 现在您在家,有一段时间没出门了,您从银行收到一条消息,说明您已借记 20000 美元。 如何? 你买的东西只花了你120美元! 这将需要与您的银行进行长时间的验证,并且银行可能需要几个月的时间来追踪和解决欺诈性交易。
如果在系统中加入欺诈检测机制,这样它就可以更容易地确定无效交易并实时失败。 然而,这个决定必须是即时的,并且系统应该根据用户过去的行为不断地训练自己。 因此,当您的欺诈检测系统需要时间来检测任何异常时,您不能指望客户在柜台等待。 您需要有一个高效且更快的系统。 如果您使用缓存将数据存储在内存中,这是可能的,例如 NCache 并在几毫秒内处理它。
通常,欺诈检测系统包含三个子系统,如图 1 所示:
- 近实时 (NRT) 系统: 该系统处理输入并使用预定义的模式和规则生成结果,而不是执行实际计算。 此外,结果必须以毫秒为单位,因为它直接响应用户。 该系统的主要目的是高吞吐量和低延迟,这意味着该系统应该理想地位于本地内存中以实现更高的性能。
- 输入处理系统: 该系统可能需要几分钟到几小时来处理输入和调整 NRT 系统的参数。 这些更新的信息被馈送到离线处理系统,进一步处理机器学习算法。
- 离线处理系统 该系统可能需要数小时到数月才能做出响应。 该系统改进模型、训练数据,并将升级后的数据反馈给 NRT 系统以获得更好的结果。
NCache 作为内存缓存和发布/订阅消息总线
NCache 是一种内存分布式缓存,提供强大的 Pub/Sub 消息传递和其他功能,例如分布式数据结构。 关注欺诈检测系统中涉及的系统, NCache 无缝适合近实时系统,因为它需要超快的结果。 这是可能的 NCache 可用于多个元素之间的通信以及存储离应用程序最近的数据,进一步减少获取数据的网络调用。
我们在 .NET 中创建了一个示例欺诈检测系统,其中包括 NCache 以提高性能和吞吐量。 您可以找到工作样本 在 GitHub 上.
在上层,应用程序是这样工作的:
- 客户端应用程序与管理给定客户交易的交易请求管理器进行通信。
- 交易信息作为消息发布给 发布/订阅主题.
- Fraud Detection Manager 订阅此主题并接收交易消息。
- 对项目执行欺诈检测逻辑,并将结果发送到事务管理器,然后再发送回客户端应用程序。
- 客户信息然后使用缓存存储在缓存中 分布式数据结构 比如列表。 这将有助于更轻松地做出未来交易的决策。
- 数据使用持久化在数据库中 后写.
使用 Pub/Sub 管理事务
事务请求管理器使用缓存进行初始化。 事务请求管理器将事务创建为消息并将其发布到其主题。
1 2 3 4 5 |
public void CreateRelevantSubscription() { MessageReceivedCallback transactionmessageReceivedCallback = new TransactionCompletedMessage(this).MessageReceivedCallback; transactionSubscription = base.CreateRelevantSubscriptions(Topics.REPLIESTOPICS, transactionmessageReceivedCallback); } |
每当通过交易请求管理器进行交易时,它首先从客户信息中创建一条消息,然后将其作为交易主题的消息发布。 该主题由欺诈检测管理器订阅,它接收消息并对传入的消息执行欺诈检测逻辑,并将结果发送回事务请求管理器。
1 2 3 4 5 |
// Sending messages on the respective topic if (customer != null) { ncache.PublishMessageOnTopic(Topics.TRANSACTIONTOPICS, CreateTransactionFromCustomer(customer), null); } |
实时检测欺诈
欺诈检测器包含用于验证交易是否有效的完整逻辑。 它的行为类似于一个处理程序,用于执行所有事务并与缓存存储建立连接。 欺诈检测管理器通过在 NCache 并订阅此主题。 欺诈检测管理器主题的回调存在于事务请求管理器逻辑中,因为它将欺诈检测逻辑的结果发送回事务请求管理器。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public void InitiliazeFraudManager() { base.CreateRelaventTopics(Topics.REPLIESTOPICS); base.CreateRelaventTopics(Topics.TRANSACTIONTOPICS); CreateRelevantSubscription(); } public void CreateRelevantSubscription() { // Initializes the relevant subscribers with their callbacks MessageReceivedCallback transacionManagermessageReceivedCallback = new StartTransactionMessage(this).MessageReceivedCallback; transactionSubscription = base.CreateRelevantSubscriptions(Topics.TRANSACTIONTOPICS, transacionManagermessageReceivedCallback); } |
在欺诈检测逻辑中,首先,从内存中获取客户数据,如果它存在,我们验证是否有任何最后一次内存交易是欺诈性的,如果是,那么我们也将此交易声明为失败。 如果没有收到这样的信息,并且所有内存中的事务都是有效的,那么我们对这个数据执行已经学习的逻辑。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
if (customerInfo != null) { if (learntLogic.FraudFoundInLastTransactions(transactionMessage, customerInfo)) { result = Result.Faliure; } } if (result != Result.Faliure) { bool isValid = learntLogic.IsTransactionValid(transactionMessage); if (!isValid) result = Result.Suspicious; } |
在这个学习的逻辑中,我们使用多个因素来确定交易的有效性。 我们检查交易是否源自有效的 IPAddress 和位于正确域中的有效电子邮件地址。 此外,该电子邮件不应存在于一系列可疑电子邮件中。 还会检查交易是否来自任何可疑位置。 如果上述任何一个标准失败,则失败权重增加。 如果失败权重大于决策权重,则交易无效。 你可以找到这个的代码 GitHub 上的逻辑.
缓存结果并将其保存到数据库
声明结果后,将在缓存中添加/更新结果。
1 2 |
FraudRequest fraudRequest = CreateFraudRequest(transactionMessage, result); ncache.UpdateCustomerInfoInCache(customerkey, fraudRequest); |
缓存是为数据源配置的。 为了在内存集群中存储客户信息,我们使用了 NCache“ 分布式列表,这是分布式数据结构之一。 客户的信息也使用持久化到数据库中 后写,它异步更新客户信息。
1 2 3 4 5 6 7 8 9 10 11 |
IDistributedList list = cache.DataTypeManager.GetList(key); if (list == null) AddCustomerInCache(key, null, cutomerInfo); else { // Update info of a customer against its id list.WriteThruOptions = new WriteThruOptions(WriteMode.WriteBehind); list.Add(cutomerInfo); } |
缓存后,会根据该结果创建一条新消息,并将其发布回事务请求管理器订阅的主题上。 它接收消息并将结果发布回客户端应用程序。
结论
NCache 是一种分布式内存中 .NET 缓存,具有 Pub/Sub、分布式数据结构、数据源提供程序等多种功能。 在本地内存中存储和处理数据的目的是消除网络传输的成本,因为所有处理都是通过缓存完成的,结果稍后会在数据库中更新。
喜欢阅读上面的文章,真的很详细地解释了一切,这篇文章非常有趣和有效。 谢谢你,祝你接下来的文章好运。