如何定时收取很多邮件的内容?

2024-08-08 09:07:59 +08:00
 i4color
现在碰到个难题,大家帮参谋一下

系统里有很多邮箱,要 10 来秒就用 pop3 检查一下有没有新邮件。同时要把邮件里的内容更新到数据库。
这些邮箱可能属于同一个人,也可能属于不同人。

我现在是单线程,循环,速度很慢。有没有优化的方法?

1.我想到就是多线程,每一个线程对应一个邮箱。
问题就是如果属于同一个人的邮箱,如何做到数据的更新不冲突?

2.我设计一个邮件抢单中心,开很多的邮件收取客户端。大家都到我这里抢任务。这样设计是不是多此一举?
1922 次点击
所在节点    Java
9 条回复
vacuitym
2024-08-08 09:09:02 +08:00
可以试试 mq ?
i4color
2024-08-08 09:14:39 +08:00
@vacuitym mq 也只是控制队列,实际上还是需要靠很多线程或客户端收取的。
loongkimc
2024-08-08 09:22:47 +08:00
1.每个邮箱起一个任务负责遍历捞邮箱的未读邮件;
2.把邮箱配置、未读邮件 ID 一条条丢给队列,直接标记为已读;
3.起 N 个消费端从队列领处理任务,失败了丢回队列排队重试,超过重试次数放入异常库。

这样会不会好一些
i4color
2024-08-08 09:36:24 +08:00
@loongkimc 嗯,你帮我想到了一些没想到的思路。
yty2012g
2024-08-08 10:23:20 +08:00
1 、在楼上的基础上,可以利用类似 Kafka 的 partition 这种机制,以用户邮箱为 key ,确保同一个用户一定在一个 partition ,然后消费者一个 partition 对应一个 thread ,这就确保一个人的数据只会被一个线程处理
2 、或者利用 Redis 的 SortedSet 数据结构,接收线程接收邮件写入 redis ,一个用户一个 key ,score 用接收的时间之类的。然后定时任务扫描 redis ,使用 lua 脚本结合 zrem+zrange ,一次获取一个人的一部分邮件,然后写 DB 。
3 、总体来说,就是要写入的时候一个用户只被一个 thread 操作,基于这个思路还能有其他的策略
julyclyde
2024-08-08 11:01:23 +08:00
建议你说一下原始需求,而不是自己先选了做法,遇到这个做法的不便再来求助

先说说,为什么要用程序去收邮件?
yinmin
2024-08-08 11:24:03 +08:00
你可以考虑改用 imap 推送的方式,有新邮件 imap 服务器会自动推送给你
lavvrence
2024-08-08 12:04:28 +08:00
IMAP IDLE, RFC 2177.
tubinorg
2024-08-08 17:51:30 +08:00
这个时候,actor 模型就特别好用
邮递员收到邮件,看到这个邮件是张三的,直接把邮件丢给张三家的邮箱里面
你可以有 N 个邮递员送邮件,速度飞起

Erlang 大法好

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1063375

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX