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

基于 Java 通知类的功能模块设计

  •  
  •   samin · 2021-02-10 23:39:59 +08:00 · 2039 次点击
    这是一个创建于 1164 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景

    根据设置会给用户生成一系列任务,有任务开始时间任务结束时间,在这段时间内执行完成,才算是正常完成任务,否则逾期。

    需求

    后台管理界面设置在任务结束时间前 N 分钟向用户发起提醒推送。

    实际用例

    前提

    1. A 用户被下达了一个 9:00 ~ 10:00 的任务
    2. 后台设置了 10 分钟的提醒功能

    结果

    A 用户在 9:50 会收到一条任务即将结束的通知

    痛点

    寻求目前业界常用的做法是啥 ? 没有做过这类功能的开发。

    我目前的解决思路

    方案一

    服务器端做轮询操作,每隔一段时间去扫描所有的任务,符合条件的通过极光推送至客户端,通过 Wobsocket 通知 Browser 后台管理端。

    方案二

    服务端做定时任务,每个任务生成的时候,自动生成一个距离结束前 N 分钟的定时任务,到时间了自动触发,通过极光推送至客户端,通过 Wobsocket 通知 Browser 后台管理端。

    方案三(只能适配客户端)

    服务端向手机 APP 端下发提醒参数,APP 端拉取用户所有进行中的任务,APP 端监听任务进行任务提醒功能。

    总结

    个人比较偏向方案三,只做客户端的提醒功能,后台管理其实不需要知道这个提醒,只需要关注结果,可以消耗更少的服务器资源实现这个需求。

    6 条回复    2021-02-12 22:52:57 +08:00
    choice4
        1
    choice4  
       2021-02-10 23:55:25 +08:00   ❤️ 1
    直接延时队列有什么问题吗
    icql
        2
    icql  
       2021-02-10 23:56:55 +08:00 via iPhone
    这不是延时消息 /队列干的事儿嘛,生成任务时发个延时消息就好了
    luozic
        3
    luozic  
       2021-02-11 00:03:59 +08:00 via iPhone
    actor 模型,非常合适这种消息
    mmdsun
        4
    mmdsun  
       2021-02-11 00:32:09 +08:00 via Android
    "
    A 用户被下达了一个 9:00 ~ 10:00 的任务
    后台设置了 10 分钟的提醒功能
    结果

    A 用户在 9:50 会收到一条任务即将结束的通知"

    你这个就是指定时间触发一个通知操作,用任务调度框架也能实现。
    wangyanrui
        5
    wangyanrui  
       2021-02-11 00:36:13 +08:00 via iPhone   ❤️ 1
    小项目直接用 redis 的 zset,大点的上个延时队列,客户端轮训即可,尽量不要客户端实现全部逻辑,否则后期想改动逻辑的话比较困难
    samin
        6
    samin  
    OP
       2021-02-12 22:52:57 +08:00
    综合想了一下,直接采用 CRON 工程做掉
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1483 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 17:11 · PVG 01:11 · LAX 10:11 · JFK 13:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.