V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
i4color
V2EX  ›  Java

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

  •  
  •   i4color · 100 天前 · 1398 次点击
    这是一个创建于 100 天前的主题,其中的信息可能已经有所发展或是发生改变。
    现在碰到个难题,大家帮参谋一下

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

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

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

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

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

    先说说,为什么要用程序去收邮件?
    yinmin
        7
    yinmin  
       100 天前 via iPhone
    你可以考虑改用 imap 推送的方式,有新邮件 imap 服务器会自动推送给你
    jaylee4869
        8
    jaylee4869  
       100 天前
    IMAP IDLE, RFC 2177.
    tubinorg
        9
    tubinorg  
       99 天前   ❤️ 1
    这个时候,actor 模型就特别好用
    邮递员收到邮件,看到这个邮件是张三的,直接把邮件丢给张三家的邮箱里面
    你可以有 N 个邮递员送邮件,速度飞起

    Erlang 大法好
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2844 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 07:41 · PVG 15:41 · LAX 23:41 · JFK 02:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.