i4color
V2EX  ›  Java

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

  •  
  •   i4color · Aug 8, 2024 · 4148 views
  •   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
    vacuitym
        1
    vacuitym  
       Aug 8, 2024
    可以试试 mq ?
    i4color
        2
    i4color  
    OP
       Aug 8, 2024
    @vacuitym mq 也只是控制队列,实际上还是需要靠很多线程或客户端收取的。
    loongkim
        3
    loongkim  
       Aug 8, 2024
    1.每个邮箱起一个任务负责遍历捞邮箱的未读邮件;
    2.把邮箱配置、未读邮件 ID 一条条丢给队列,直接标记为已读;
    3.起 N 个消费端从队列领处理任务,失败了丢回队列排队重试,超过重试次数放入异常库。

    这样会不会好一些
    i4color
        4
    i4color  
    OP
       Aug 8, 2024
    @loongkimc 嗯,你帮我想到了一些没想到的思路。
    yty2012g
        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 操作,基于这个思路还能有其他的策略
    julyclyde
        6
    julyclyde  
       Aug 8, 2024
    建议你说一下原始需求,而不是自己先选了做法,遇到这个做法的不便再来求助

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

    Erlang 大法好
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3163 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 73ms · UTC 13:25 · PVG 21:25 · LAX 06:25 · JFK 09:25
    ♥ Do have faith in what you're doing.