遇到过的判断营销活动状态的两种方案

利用活动开始时间和结束时间


像天猫、京东、唯品会,经常会推出各种各样的营销活动来吸引用户购买,营销活动是有状态的,一般来说,有以下几种状态。

活动未开始,活动已开始、活动已结束、活动已废弃

活动未开始、已开始、已结束,这三个状态可以使用活动开始时间和活动结束时间来得出。

public int getActivityState(Activity activity,Date currentDate) {
        if (activity.getEndTime().compareTo(currentDate) <= 0) {
            return ENDED;
        }

        if (activity.getBeginTime().compareTo(currentDate) <= 0 && activity.getEndTime().compareTo(currentDate) > 0) {
            return STARTING;
        }

        if (activity.getBeginTime().compareTo(currentDate) > 0 ) {
            return NOT_START;
        }

        return NOT_START;
    }

一般来说,为了应付突发情况,比如说,某个已经进行的活动是有问题的,必须由后台人员强制结束或者废弃掉这个活动。因此还需要用一个is_discarded字段保存这个状态。

public int getActivityState(Activity activity,Date currentDate) {
        if(activity.getIsDiscard() == 1) {
            return DISCARD;
        }

        if (activity.getEndTime().compareTo(currentDate) <= 0) {
            return ENDED;
        }

        if (activity.getBeginTime().compareTo(currentDate) <= 0 && activity.getEndTime().compareTo(currentDate) > 0) {
            return STARTING;
        }

        if (activity.getBeginTime().compareTo(currentDate) > 0 ) {
            return NOT_START;
        }

        return NOT_START;
    }

到此,判断活动状态的代码已经收拢在一个方法里了。如果代码工程里的其他模块需要获取活动状态,可以直接调用。如果是外部系统需要调用,则可以对外封装成一个微服务方法。

上面的这种做法我是比较推荐的,以前也都是这么用的


利用延迟消息


之前还见过另外一种做法,就是在数据库里使用一个state字段,它的枚举值也是:

活动未开始,活动已开始、活动已结束、活动已废弃

第一次看到这个表设计的时候,我很纳闷。因为活动已开始和已结束,这个操作并不能从后台触发,而是随着时间的逝去,在将来某个时间点触发。既然这样,谁来维护这个字段呢??

后来请教了原来的表设计者,他说是利用延迟消息来维护这个字段的。当活动刚刚创建的时候,就发一条延迟消息到队列里,根据活动开始时间和结束时间,计算延迟时间。时间一到,就触发消息。消息接收者收到消息后,更新数据库字段。这样使用方判断活动状态的时候,就只需要读取这个字段,看看枚举值即可。

但是为了维护这个字段而引入MQ,代价太大了吧。另外活动状态这么关键的业务字段,需要完全依赖MQ,风险实在太高了。真心不建议这么干。


猜你喜欢

转载自blog.csdn.net/linsongbin1/article/details/80381078