使用Azure Service Bus排队电子邮件

4
我们刚刚将一些工作负载迁移到Azure上,我目前正在管理这些工作负载。我了解了一些Service Bus的知识,想知道是否可以使用它来排队电子邮件。
通过使用自定义库托管在Azure中的应用程序将电子邮件传递到Service Bus队列,其中一个或多个工作进程将从队列中选取信息,并通过邮件中继服务发送。
这将使我的开发人员免于关注我在任何时候使用的邮件中继服务的详细信息,同时我也可以在发送消息之前执行进一步处理操作,而无需更改开发人员的代码。
我的问题是,这是否可行?如果是,是否建议这样做?在实现此类解决方案时需要注意什么?对如何实现此解决方案的任何指针也将不胜感激。

是的,这是可能的。你目前尝试了什么?这只是一个处理工作量的队列系统。 - Peter
我还没有尝试过,只是在逐渐熟悉 Azure 基础设施,我只想知道它是否值得投入精力或者是一条死路。我也想知道这是否是个好主意。 - araoko
3个回答

7
是的,向Azure Service Bus队列添加消息,并在稍后由一个应用程序检索这些消息并基于排队的消息中的细节发送电子邮件是合理的解决方案。这是使用微服务方法向单个应用程序内的不同部分提供电子邮件发送服务,甚至跨组织中的许多应用程序的良好方式来解耦各种应用程序的方法。
需要注意的一点是Azure Service Bus队列中的消息大小确实有最大大小限制。根据发送的电子邮件内容的长度,您将需要将消息的详细信息存储在某个地方,例如数据库或Azure表存储中。然后,队列中的消息将包含一个标识符,例如GUID,该标识符可用于在接收应用程序处理它以发送电子邮件时稍后查找消息详细信息。无论队列中消息的大小如何,电子邮件可能会变得相当长,因此使用此方法可能是您避免实施问题的最佳选择。

你知道一种有效的方法来序列化MailMessage对象吗?我希望这个库的用户可以像平常一样创建邮件,但是通过库发送。到目前为止,我看到的所有实现都涉及使用 .net 类的内部方法(可能随时更改)或先将对象序列化到磁盘上再读取它,这可能会影响性能。 - araoko
@araoko 我从未尝试过序列化MailMessage。我不建议这样做。电子邮件消息可能相当长,并且很容易使用超过服务总线队列消息的可用消息大小。我建议您创建自己的类,类似于MailMessage,然后将其存储在表存储中,并在队列消息中使用指针。 - Chris Pietschmann
我想按照你的建议将MailMessage序列化到Blob存储中,并在队列上传递指针。如果我创建自己的类,这意味着所有现有的代码都将被更改以使用我的类,我将把它作为最后的选择。 - araoko

1

如果不知道您的系统、需求或消息与队列之间的需求,我建议如下:

  • 如果您的应用程序需要消息传递,则可以使用Azure Service Bus将电子邮件排队。
  • 如果答案是“否”,则使用仅限排队的东西:Azure Storage Queues。

0

这是可行的,也是一个不错的选择。大多数电子邮件服务在其系统中使用队列。

您可以使用队列的优先级属性。事务性邮件>通知邮件>营销邮件,您可以给予高到低的优先级。因为队列按照先进先出的原则工作,事务性邮件不应该等待营销邮件。

在实施之前,您可以使用标签来区分消息。

如果您在尝试发送电子邮件后无法成功(默认情况下Azure为10次),您应该将其移动到死信队列Azure服务总线会为您执行此操作。但是,然后您应该消耗deadqueue以处理这些电子邮件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接