c# - 每天在用户指定时间发送电子邮件通知

标签 c# azure asp.net-core azure-functions hangfire

我们使用 ASP Net Core 开发了一个应用程序,其中的使用需要获得批准。用户将在用户指定的时间收到待批准的电子邮件。

示例

user1 将接收电子邮件的时间设置为中午 12.55

user2 将接收电子邮件的时间设置为下午 4 点

我们已将用户设置的时间保存在数据库中,目前我们正在计时器触发器上运行Azure Function应用。该触发器将每 15 分钟运行一次,并检查 SQL 数据库中的用户通知时间。因此,如果用户将时间设置为中午 12.31 点,一旦触发器每 15 分钟运行一次,他就会在中午 12.45 点之后收到电子邮件。问题是用户必须等待 15 分钟,并且电子邮件未准时发送。

我们已经检查了 HangFire 重复作业,但问题是它每分钟都会调用我们的 SQL 数据库,这会导致性能影响。

有没有更好的解决方案可以在用户指定的时间发送电子邮件通知,而不需要每分钟调用 SQL 数据库来检查指定的用户时间是否可以发送通知?

最佳答案

您可以使用延迟传送的队列。

本质上,当创建条目时,您会将消息推送到队列中,并通过计算 DesiredTime - Now 来延迟其传递。然后您只需实现一个队列监听器即可。在所需的时间,一条消息将弹出到队列中并由您的工作人员处理。然后,您将新消息推送到队列中,延迟到下一个所需时间。

使用此解决方案,您可以在数据库压力几乎为零的情况下挂起大量电子邮件。它将水平扩展电子邮件的处理,并且立即具有相当好的可靠性。根据您使用的队列,成本也相当低。

您可以使用 Azure 存储队列来实现此目的。


CloudQueueMessage message = new CloudQueueMessage(requestBody);

// The message will be visible in the queue after 3 days
queue.AddMessage(message, initialVisibilityDelay: TimeSpan.FromDays(3));

您可能需要做一些额外的事情来确保这是可靠的,例如启用死信队列并拥有重新排队机制,以防处理消息时出现错误。

引用文献

CloudQueueMessage.AddMessage

initialVisibilityDelay Nullable<TimeSpan>

A TimeSpan specifying the interval of time from now during which the message will be invisible. If null then the message will be visible immediately.

关于c# - 每天在用户指定时间发送电子邮件通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76285321/

相关文章:

c# - EWS 设置扩展属性问题

asp.net-core - 在 ASP.NET Core 中禁用分块

c# - 从 Azure Blob 存储和 ASP.NET Core 3 流式传输视频

Azure 数据工厂 ForEach 事件定价

azure - SonarQube SQL Azure 数据库支持在 5.5 中中断?

mysql - 包 MySql.Data 6.9.8 与 netcoreapp1.0 不兼容

c# - 在Unity中使用ARKit 2.0的AREnvironmentProbeAnchor.environmentTexture生成反射探针

c# - 当我设置 WPF 子窗口的 Owner 属性时,是否会阻止它被垃圾收集?

c# - EF Core 2.0 标识 - 添加导航属性

android - Android 应用程序 Azure 依赖项 gradle 构建时出错