azure 每天在用户指定的时间发送电子邮件通知

xfb7svmp  于 2023-05-23  发布在  其他
关注(0)|答案(2)|浏览(174)

我们已经开发了一个应用程序使用ASP网络核心的用途有批准被批准。用户将在用户指定的时间收到待批准的电子邮件。

示例

user1将接收电子邮件的时间设置为下午12:55
user2将接收电子邮件的时间设置为下午4点
我们已经在数据库中保存了用户设置时间,目前我们正在timer trigger上运行Azure Function应用程序。触发器将每15分钟运行一次,并检查SQL数据库中的用户通知时间。因此,如果用户将时间设置为12.31 pm,则一旦触发器每15分钟运行一次,他将在12.45 pm之后收到电子邮件。问题是用户必须等待15分钟,电子邮件不准时。
我们已经检查了HangFire Recurring jobs,但问题是它每分钟都会调用我们的SQL数据库,这会导致性能影响。
有没有更好的解决方案可以在用户指定的时间发送电子邮件通知,而无需每分钟调用SQL数据库来检查指定的用户时间是否可用于发送通知?

o0lyfsai

o0lyfsai1#

您可以使用具有延迟传递的队列。
实际上,当创建条目时,您将把消息推入队列,并通过计算DesiredTime - Now来延迟其传递。然后只需实现一个队列侦听器。在所需的时间,一条消息将弹出到队列中,并由您的worker处理。然后将一条新消息推入队列,延迟到下一个所需的时间。
有了这个解决方案,你可以挂起一个非常大量的电子邮件与近0压力对您的数据库。它将横向扩展电子邮件的处理,并立即具有相当好的可靠性。成本也很低,具体取决于您使用的队列。
您可以使用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>
一个TimeSpan,指定从现在起消息不可见的时间间隔。如果为null,则消息将立即可见。

pw136qt2

pw136qt22#

创建一个带有计时器触发器的Azure函数来处理计划的消息:
var queueClient = new QueueClient(serviceBusConnectionString, queueName);
...
await queueClient.SendAsync(message);
步骤如下。

  • 构造用户通知消息
  • 将用户通知转换为JSON并创建服务总线消息
  • 安排在用户指定的时间传递消息
  • 将消息发送到服务总线队列

相关问题