一个高并发的需求,大家可以讨论讨论,集思广益
1. 需求
昨天接到一个需求,需要我把Jenkins运行完的任务日志(日志很大,有的几十M)存起来,到时候上游会有多个进程,不断的给我传数据,我需要把他们传的日志入库,他们请求的频率很高,可能每秒大几百次,然后这些日志后续还需要有查找功能 根据测试集id查找后 展示到前端,假如某个测试集正在运行,那么这个日志还需要和前端建立websocket连接,不断的把最新的日志推送到前端
这个其中一个进程的请求实例,每个info就是一次请求,我没有copy完整,可能存在多个进程请求。
TicketServiceFits_BC
2023-01-11 09:23:57,870 - INFO: 实际结果:P
2023-01-11 09:23:57,870 - INFO: la
2023-01-11 09:23:57,870 - INFO: 设置
2023-01-11 09:23:57,871 - INFO: label_
2023-01-11 09:23:57,871 - INFO: 实际结果:P
2023-01-11 09:23:57,871 - INFO: userna
2023-01-11 09:23:57,871 - INFO: 设置变量:usern
2023-01-11 09:23:57,871 - INFO: 设置变量:获取用户信
2023-01-11 09:23:57,872 - INFO: 交易日 关键字-fl
2023-01-11 09:23:57,872 - INFO: 设置变量: {"ex
2023-01-11 09:23:57,872 - INFO: exchan
2023-01-11 09:23:57,872 - INFO: 设置变量:e
2023-01-11 09:23:57,873 - INFO: exchan
2023-01-11 09:23:57,873 - INFO: 实际结果:"
2023-01-11 09:23:57,873 - INFO: ex
2023-01-11 09:23:57,873 - INFO: 设置
2023-01-11 09:23:57,874 - INFO: 交易日信息
2023-01-11 09:23:57,906 - INFO: 设置变量:交易日信息
...
2.我的思考
我思考了下,这个每秒钟几百次请求,我们的机器是window server 2012,5核32G的内存。直接在laravel里做,估计扛不住,可能还会影响平台主要业务,然后日志这种大文件存储,mysql肯定不适合了,我这边打算用mongdb来存
因为涉及的功能很简单 我打算用一台新机器,直接用原生php来写,毕竟只涉及简单的入库,代码也简单,效果高。
然后我的方案就是 nginx+php+mongodb ,然后收到请求后把数据直接扔到队列里处理。
对于和前端交互的部分,我是打算每次前端请求的时候,查询当前测试集是否运行完了,如果没有运行完 则通知前端和我进行websocket连接,这时候把已经建立的websocket的测试集id存在缓存里,然后收到该测试集id的日志时 就调用gateaway-worker群发功能 把日志推送到群里组
大家有没有好的思路,可以讨论讨论!多多指教 谢谢大家
kafka+es。 上游不在给你传而是直接存到kafka。 你多开几个进程读取存到es。 后面查在es里面查