You need to sign in to view this topic
This topic created in 712 days ago, the information mentioned may be changed or developed.
现在碰到个难题,大家帮参谋一下
系统里有很多邮箱,要 10 来秒就用 pop3 检查一下有没有新邮件。同时要把邮件里的内容更新到数据库。
这些邮箱可能属于同一个人,也可能属于不同人。
我现在是单线程,循环,速度很慢。有没有优化的方法?
1.我想到就是多线程,每一个线程对应一个邮箱。
问题就是如果属于同一个人的邮箱,如何做到数据的更新不冲突?
2.我设计一个邮件抢单中心,开很多的邮件收取客户端。大家都到我这里抢任务。这样设计是不是多此一举?
9 replies • 2024-08-08 17:51:30 +08:00
 |
|
3
loongkim Aug 8, 2024
1.每个邮箱起一个任务负责遍历捞邮箱的未读邮件; 2.把邮箱配置、未读邮件 ID 一条条丢给队列,直接标记为已读; 3.起 N 个消费端从队列领处理任务,失败了丢回队列排队重试,超过重试次数放入异常库。
这样会不会好一些
|
 |
|
5
yty2012g Aug 8, 2024
1 、在楼上的基础上,可以利用类似 Kafka 的 partition 这种机制,以用户邮箱为 key ,确保同一个用户一定在一个 partition ,然后消费者一个 partition 对应一个 thread ,这就确保一个人的数据只会被一个线程处理 2 、或者利用 Redis 的 SortedSet 数据结构,接收线程接收邮件写入 redis ,一个用户一个 key ,score 用接收的时间之类的。然后定时任务扫描 redis ,使用 lua 脚本结合 zrem+zrange ,一次获取一个人的一部分邮件,然后写 DB 。 3 、总体来说,就是要写入的时候一个用户只被一个 thread 操作,基于这个思路还能有其他的策略
|
 |
|
6
julyclyde Aug 8, 2024
建议你说一下原始需求,而不是自己先选了做法,遇到这个做法的不便再来求助
先说说,为什么要用程序去收邮件?
|
 |
|
7
yinmin Aug 8, 2024 via iPhone
你可以考虑改用 imap 推送的方式,有新邮件 imap 服务器会自动推送给你
|
 |
|
9
tubinorg Aug 8, 2024 1
这个时候,actor 模型就特别好用 邮递员收到邮件,看到这个邮件是张三的,直接把邮件丢给张三家的邮箱里面 你可以有 N 个邮递员送邮件,速度飞起
Erlang 大法好
|