【问题标题】:Expiration notification到期通知
【发布时间】:2013-04-10 12:09:08
【问题描述】:

自购买之日起 12 个月后向客户发送通知电子邮件的最直接方式是什么?

我们的 Web 服务器运行一个连接到 SQL Server 的 ASP.NET MVC 3 网站。目前我们每周一手动运行一个通知过期用户的网页。

以下是我目前想到的选项:

  1. 每天使用任务计划程序运行网页
  2. 构建一个控制台应用程序,不断检查计时器并最终发送通知
  3. 构建一个类似于 2) 的 windows 服务,在出现故障时可以自动重启

我错过了一些更简单的东西吗?

谢谢。

【问题讨论】:

    标签: .net asp.net-mvc web-applications windows-server-2008


    【解决方案1】:

    我在以前的公司也遇到过同样的问题。最后,我们选择了任务计划程序。主要原因是 Task Scheduler 是 Windows 中处理重复性任务的标准机制,因此在未来比其他选项更易于维护。

    我们的控制台应用程序每天由任务计划程序运行,它被设计为“智能”。我的意思是聪明。

    • 控制台应用程序是一个调用 WCF 服务的虚拟应用程序。所有逻辑都在 WCF 服务内部。这样做的原因是将所有代码保存在同一个位置。
    • 如果运行失败会在我们的系统日志中写入警报(每天检查一次,它是一个数据库表)。如果发生灾难性故障(无法访问数据库),我们会写入控制台应用目录中的文件。
    • 如果它已经在处理中,则不允许运行第二个实例(某种单例)
    • 它会在 DB 中跟踪发送了哪些电子邮件,因此,如果同一天执行两次,只发送第一次电子邮件。
    • 它有一个 /whatif 参数
    • 如果电子邮件失败,则会记录下来并继续处理。
    • 如果它必须发送多封电子邮件并在某个时刻失败,则下一次执行将从它停止的点开始。

    内部代码类似于

    Linq to get all the users that deserved an email
    For each user
      Send the email, mark it as sent in DB and close transaction
      If email fails Write to log.
    Next
    Write log with stats
    

    这样更慢但更安全。如果它必须向 4000 个用户发送电子邮件并且在用户 1337 中失败,那么我们有一个发生的日志,并且下次执行它将从 1338 恢复。

    在我们的一个文件夹中的系统日志中,我们通常每天都会有一个条目,内容如下:

    电子邮件进程由调度程序在 02:00 开始。已发送 4000 封电子邮件,0 封失败。

    如果失败:

    电子邮件进程由调度程序在 02:00 开始。已发送 3999 封电子邮件,其中 1 封失败。 发送给用户 xxxxx 的电子邮件失败。原因:电子邮件地址“joeBlogs@@gmail.com”不正确。

    【讨论】:

    • 使用 WCF 服务而不是经典控制台应用有什么好处?
    • 不是一个大的。主要是为了让所有逻辑都在同一个地方。它的功能也更易于重用。例如,您可以有一个手动触发更新调用相同进程的网页。甚至还有另一个以 /whatif 模式运行的网页,并告诉哪些用户会在进程启动时收到电子邮件。
    猜你喜欢
    • 2021-07-21
    • 2016-01-11
    • 1970-01-01
    • 2014-08-22
    • 2020-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多