假设有一些系统在发生某些事情时填充数据库中的行:
user_logins
中使用登录类型和时间向数据库插入一行。outgoing_calls
然后在一段时间结束后,比如说月份,我们需要一份报告,告诉谁打电话给谁,有多少电话没有接听,等等。应该用什么模式来组织这个功能?
乍一看这个过程似乎记录了很多,但是当我们存储具有某种格式的消息(date-processId-messageWithPlaceHolders)时,日志记录是一个过程。所以使用日志系统并不是很合适。
从另一个角度看,它看起来像事件处理,但是当" event"时,没有必要做任何动作。发生,没有听众,没有队列。只需存储到数据库以进行进一步报告。
那么应该使用什么样的模式或技术来有效地实现这个功能呢?
答案 0 :(得分:1)
您的要求是每月生成一个谁叫谁报告,以便您可以,例如,了解您的通话成功(或任何原因)。
您无需考虑与日志记录或事件处理或任何事物的相似性。只需从上到下分析问题,即可获得完成任务所需的最少工作量:
因此,一个好的解决方案是每月运行批处理作业。这可以是手动运行的java进程,cron作业,hadoop任务,...取决于你的技术堆栈。您的活动需要在发生时存储。同样,根据您的堆栈,它可以是关系数据库,键值存储,带有日志行的文件......,在您的技术堆栈中最容易使用的是什么。
所有这些选项都可能很好,但有些可能更好。例如,我建议不要使用纯字符串日志记录。您需要提取时间,数字等结构化属性,因此更喜欢一种可以帮助您保持类型安全的格式。
答案 1 :(得分:0)
我会使用刚刚实现它的业务服务模式:
BufferedReader
假设错过了一个电话,那么就会通知您的商业服务。如果没有答案应该触发数据库更新,我会改变逻辑并记录成功的答案:
void login(User user) {
entityManager.persist(new UserLogin(user));
}
void call(Operator op, User user) {
entityManager.persist(new PhoneCall(op, user));
}
void missedCall(User user, Operator op) {
entityManager.persist(new MissedCall(user, op));
}
并报告void answeredCall(UserCall call, Operator op) {
entityManager.merge(call).setAnsweredBy(op);
}
。
在任何一种情况下,我都会通过查询数据库来进行报告。
<强>替代强>
如果您的业务服务中的大多数操作都需要如此记录,我可能会使用AOP拦截器自动执行此操作。