我正在寻找有关如何使用Azure WebJobs处理排队和发送不同类型电子邮件的能力的建议。
在发送电子邮件之前,需要做一些业务逻辑来撰写,填充然后发送。所以说我有10种不同类型的电子邮件
2封电子邮件示例
1)预订确认后,我想要
var note = new BookingConfirmNotification() { BookingId = 2 }
SomeWayToQueue.Add(note)
2)或当我需要提醒用户做某事时
var reminder = new ReminderNotification() { UserId = 3 }
SomeWayToQueue.Add(reminder, TimeSpan.FromDays(1)
使用WebJob上的QueueTrigger为每种不同类型的电子邮件创建队列是否更好?或者有更好的方法吗?
更新
所以我认为你可以用不同的强类型类添加不同的函数/方法来触发不同的方法,但这似乎不起作用。
public void SendAccountVerificationEmail(
[QueueTrigger(WebJobHelper.EmailProcessorQueueName)]
AccountVerificationEmailTask task, TextWriter log)
{
log.WriteLine("START: SendAccountVerificationEmail: " + task.UserId);
const string template = "AccountVerification.cshtml";
const string key = "account-verification";
PrepareAndSend(user.Email, "Account confirmation", template, key, task, typeof(AccountVerificationEmailTask));
log.WriteLine("END: SendAccountVerificationEmail: " + task.UserId);
}
public void SendForgottonPasswordEmail(
[QueueTrigger(WebJobHelper.EmailProcessorQueueName)]
ForgottonPasswordEmailTask task, TextWriter log)
{
const string template = "ForgottonPassword.cshtml";
const string key = "forgotton-password";
PrepareAndSend(user.Email, "Forgotton password", template, key, task, typeof(ForgottonPasswordEmailTask));
}
这不起作用 - 将消息添加到队列
时会随机触发不同的方法如何使用WebJobs实现类似的功能?
答案 0 :(得分:2)
你是说“compose / populate”逻辑有点沉重,这就是你想要排队的原因吗?什么进程/实体正在创建这些“发送电子邮件”任务?
我可以看到你有一个Azure Queue,其中电子邮件请求排队。假设您正在使用WebJobs SDK(如果您正在处理Azure存储队列等,则应该是这样),您可以使用一个函数来监视发送消息的队列。 WebJobs SDK Extensions包含 SendGrid电子邮件绑定。您可以看到一个与您所描述的内容相近的示例here。此示例基于传入的队列消息发送电子邮件。以这种方式使用SDK,您将获得自动重试支持,毒物队列处理等。
答案 1 :(得分:0)
关于您更新的问题。当多个消费者使用队列时,他们将“循环”,这意味着消息在所有可用的消费者之间分配。这解释了为什么这些方法似乎是随机发射的。
要考虑的事情。您可能希望反转内容并使用队列来捕获用户的交互。
在背后,您可以执行一项或多项操作。
例如。
_bus.Send(new BookingCreatedEvent{Ref="SomeRef", Customer="SomeCustomer"});
或
_bus.Send(new BookingCancelledEvent{Ref="SomeRef");
这样做的好处是您可以选择在消费方面做什么。现在您想要发送电子邮件,但如果您还要登录数据库或将记录发送到您的CRM,该怎么办?
如果切换到Azure Service Bus主题/订阅,则可以为同一事件提供多个处理程序。
public static void SendBookingConfirmation([ServiceBusTrigger("BookingCreated","SendConfirmation")] BookingCreatedEvent bookingDetails)
{
// lookup customer details from booking details
// send email to customer
}
public static void UpdateBookingHistory([ServiceBusTrigger("BookingCreated","UpdateBookingHistory")] BookingCreatedEvent bookingDetails)
{
// save booking details to CRM
}