假设我有一个通用的传奇场景(给定三个不同的微服务 A、B 和 C,通过消息传递进行通信):
1. Service A
a. Performs operation A successfully
b. Communicates update with message A
2. Service B (after receiving message A)
a. Performs operation B successfully
b. Communicates update with message B
3. Service C (after receiving message B)
a. Fails to perform operation B
b. Communicates failure
4. Service A and B performs compensating actions
Run Code Online (Sandbox Code Playgroud)
据我了解,虽然整个工作流程应该最终保持一致,但您希望确保本地操作( 和a)b在事务上保持一致,以避免丢失消息(或者如果相反,避免发送消息但无法持久保存操作更改)。
如果我没记错的话,这就是事务发件箱模式旨在解决的问题。
在 Azure 上的 .NET 上下文中,使用
有没有一种方法可以在不将消息保存到数据库的情况下获得相同级别的事务安全性(即不使用事务发件箱)?
我见过很多System.Transactions提及,但它要么用于多个数据库操作 …
transactions consistency azure azureservicebus entity-framework-core
我正在学习如何在Azure云应用程序和客户端应用程序之间进行通信,并完成本教程.
我目前有一个.exe工作进程的实例,它通过服务总线发送消息.我还有一个客户端角色,我在本地机器上运行以阅读消息.但是,当我运行客户端的多个实例时,每个客户端都会获取一些消息,而这些消息都没有得到完整的读数.是否可以使用队列或服务总线,以便客户端的每个实例都可以看到工作人员生成的所有消息?
例如,3台不同计算机上的3个人可能希望独立监视同一计算任务的状态.
我们有一个侦听Azure服务总线队列的服务.我们有另一个服务来监听这个队列的死信队列.我们还有一系列测试,这些测试在部署后针对我们的Azure应用程序运行.
我们想扩展我们的自动化测试,以便处理死信的部分也经过测试,但不确定我们如何编写测试以确保消息到达死信队列,因为在正常情况下消息不会死信.
目前我们正在手动测试,但我觉得这不是一个长期的选择.
有任何想法吗?
在azure服务总线消息传递中使用azure服务结构的典型用例是什么?尽管azure服务总线消息声称符合AMQP 1.0标准,但我仍然会写信给azure的服务总线消息api.在我看来,两者都是平台即服务(PaaS)解决方案.我更感兴趣的是为什么我会使用一个而不是另一个.谢谢.
我正在为Azure开发两个WebJob:一个将使用主题将消息放入Service Bus队列,另一个将使用相同主题将消息订阅到ServiceBusTrigger。
消息已正确发送到服务总线队列,但是当运行WebJob订阅ServiceBusTrigger时,这些消息将不会以FIFO为基础进行处理。
将消息放入服务总线队列中的WebJob的代码如下:
NamespaceManager namespaceManager = NamespaceManager.Create();
// Delete if exists
if (namespaceManager.TopicExists("SampleTopic"))
{
namespaceManager.DeleteTopic("SampleTopic");
}
TopicDescription td = new TopicDescription("SampleTopic");
td.SupportOrdering = true;
TopicDescription myTopic = namespaceManager.CreateTopic(td);
SubscriptionDescription myAuditSubscription = namespaceManager.CreateSubscription(myTopic.Path, "ImporterSubscription");
TopicClient topicClient = TopicClient.Create("SampleTopic");
for(int i = 1; i <= 10; i++)
{
var message = new BrokeredMessage("message"+i);
topicClient.Send(message);
}
topicClient.Close();
Run Code Online (Sandbox Code Playgroud)
订阅服务总线触发器的WebJob具有以下代码:
namespace HO.Importer.Azure.WebJob.TGZProcessor
{
public class Program
{
static void Main(string[] args)
{
JobHostConfiguration config = new JobHostConfiguration();
config.UseServiceBus();
JobHost host = new JobHost(config);
host.RunAndBlock(); …Run Code Online (Sandbox Code Playgroud) c# azureservicebus azure-servicebus-queues azure-webjobs azure-servicebus-topics
我正在使用Telerik Platform开发移动应用程序.应用程序使用的服务是Azure上托管的ASP.NET Web API RESTful服务.我想通过添加服务总线为应用程序构建一些弹性,并且一直在寻找Azure服务总线,这似乎是我正在寻找的.
这对我来说还算新,我有几个问题.
我有一个Azure函数,用于侦听Azure Servicebus队列中的消息.当它收到消息时,它将它们标记为已完成,并且它们不再在队列中.有没有办法只在长过程完成时将它们标记为?如果失败,还是将它们标记为完整?
我的函数调用Api,我希望消息不被标记为完成,直到Api用成功代码回复.
我有一个Azure函数监视Azure服务总线队列,默认锁定持续时间为30秒.此azure函数根据来自队列的消息中的用户信息发送电子邮件通知.
我注意到重复的电子邮件发出并因此检查了跟踪日志,以找出已为同一用户调用了两次azure函数.日志条目如下:
2018-08-09T 14:38:05 .1249371Z - 执行'AzureFunction'(Reason ='在'servicebusqueue'上检测到新的ServiceBus消息.',Id = 4657012a-94ac-4b22-a628-2e94285aeeb7)
2018-08-09 T14:38:33 .3335833Z - 执行'AzureFunction'(Reason ='在'servicebusqueue'上检测到新的ServiceBus消息.',Id = 3ff8eea3-9b9b-43ae-a797-5acf01c2ae6c)
消息只添加到队列一次,我试图了解什么可以生成另一个.可以因为锁定持续时间吗?
azure azureservicebus azure-servicebus-queues azure-servicebus-topics azure-functions
我目前使用ServiceBusTrigger绑定具有azure函数
[ServiceBusTrigger("%TopicName%", "%SubscripionName%", Connection = "MyConnection")]
string catclogueEventMsgs, ILogger log, ExecutionContext context)
Run Code Online (Sandbox Code Playgroud)
使用此local.settings.json文件
"Values": {
…
"MyConnection": "Endpoint=sb://testxxxxxxxxxxxxxxxxxx
"SubscriptionName": "testsubscriptionName"
"TopicName": "testtopicName",
}
Run Code Online (Sandbox Code Playgroud)
我如何在appsettings.json文件中表示这一点。会像下面吗?
"Values": {
"MyConnection": "Endpoint=sb://testxxxxxxxxxxxxxxxxxx
"SubscriptionName": "testsubscriptionName"
"TopicName": "testtopicName",
}
Run Code Online (Sandbox Code Playgroud)
我可以使用“ MySubs”对象代替如下的“ Values”对象吗?
"MySubs": {
"MyConnection": "Endpoint=sb://testxxxxxxxxxxxxxxxxxx
"SubscriptionName": "testsubscriptionName"
"TopicName": "testtopicName",
}
Run Code Online (Sandbox Code Playgroud)
如果可以使用上面的设置,如何在ServiceBusTrigger绑定中表示呢?我会改成这个吗?
[ServiceBusTrigger("%MySubs.TopicName%", "%MySubs.SubscripionName%", Connection = "MySubs.MyConnection")]
string catclogueEventMsgs, ILogger log, ExecutionContext context)
Run Code Online (Sandbox Code Playgroud) 我有带有服务总线主题触发器的Azure服务总线。我的功能看起来像这样
[FunctionName("SbListener")]
public static async Task Run(
[ServiceBusTrigger("test-topic", "test-sub-1", Connection = "ServiceBus")]string message,
[Inject("Microsoft.EventStore.Functions", true)] IWebNotificationManagerFactory webNotificationManagerFactory,
[Inject("Microsoft.EventStore.Functions", true)] ILogger logger)
{ ... }
Run Code Online (Sandbox Code Playgroud)
我的服务总线的配置位于local.settings.json文件中。
"ConnectionStrings": {
"ServiceBus": "Endpoint=sb://<my-sb>.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=<my-key>"
}
Run Code Online (Sandbox Code Playgroud)
我正在寻找的是我也想从配置文件中引用主题名称,而不是在中将它们硬编码ServiceBusTrigger。问题是,如果我更改了订阅名称,那么我将不得不重新部署功能代码(我想不惜一切代价避免这种情况)。
azure azureservicebus azure-servicebus-topics azure-functions