我有一个 api,notifyCustomers()
在我的批处理服务器上实现,它从我的应用程序服务器调用。它可以通过短信、推送和电子邮件三种渠道发送通知。我为它们中的每一个都有单独的帮助类,它们都以异步模式执行。
我有大约 30k 用户,我通常会向 3k 到 20k 的特定用户群发送通知。我面临的问题是,每当我调用该 api 时,mysql 的性能都会受到影响,尤其是 CPU。CPU 利用率在 30 分钟左右的很长一段时间内保持在 100% 左右
我已经通过执行以下操作找到了解决方法,这有助于我控制事情:
- 使用投影代替域对象
- 在每次调用中批量获取 500 条数据
- 根据我需要的标准实施索引
- 没有来自 SMS、Email 和 Push 的异步方法的数据库调用
- Thread.sleep(10 mins) 在数据批次的每个后续提取操作之间 <== 这是让我很困扰的肮脏黑客
如果我删除Thread.sleep()
,那么一切都会变得混乱,因为批处理服务器只是调用异步方法,然后启动 db 调用以非常快速地连续获取下一批 500 个用户,直到 db 服务器停止响应。
我需要帮助来解决我应该做的事情,以便在控制事情的同时摆脱第 5 点?我在具有 300 IOPS 和 4 GB RAM (db.t3.medium) 的 RDS 上运行 mysql