我使用AzureQueue在角色之间进行通信.我的消息如"GoToMaintenanceMode","StopSendingEmails","DoNotAcceptRequests"等.但我意识到,当我有多个实例时,由于队列消息,它将无法用于我的场景,一次只显示1个实例.
所以我的问题是旁边的选项是否有一个优雅的方式来处理像Role.AllInstances.Run()等问题?
我正在使用它的方法: 实例查看消息,将它自己的实例id添加到消息中并将其放回队列,如果消息包含它自己的实例id,则不会查看消息.
PS我不想实现TCP侦听器,如果有的话请求原生解决方案.
我希望有人能澄清一些关于Azure存储队列及其与WebJobs交互的内容:
要执行重复的后台任务(即添加到队列一次,然后按设定的间隔重复),有没有办法更新QueueTrigger函数中提供的相同消息,以便可以扩展其租约(可见性)作为重新排队和避免的方式到期?
通过上面提到的重复后台作业模式,我也试图找出一种"按需"删除/过期作业的方法.因为在WebJobs的上下文之外似乎不可能这样做,所以我想可能将messageId和popReceipt存储在Table存储中作为持久缓存删除,然后在QueueTrigger函数中传递消息时执行DeleteMessage的表查找,以便不再重复该消息.
任何建议或提示表示赞赏.干杯:)
azure azure-table-storage azure-storage-queues azure-webjobs
我正在使用Azure Functions Preview并想要添加QueueTrigerFunction.
该函数定义如下:
[FunctionName("QueueTrigger")]
public static void Run([QueueTrigger("testqueue1", Connection = "AzureWebJobsStorage")]string myQueueItem, TraceWriter log)
{
log.Info($"C# Queue trigger function processed: {myQueueItem}");
}
Run Code Online (Sandbox Code Playgroud)
使用local.settings.json:
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "DefaultEndpointsProtocol=https;AccountName=test1storage;AccountKey=XXXXX==;EndpointSuffix=core.windows.net/;",
"AzureWebJobsDashboard": ""
}
}
Run Code Online (Sandbox Code Playgroud)
当我启动VS调试器时,我收到以下错误消息:
[8/5/2017 1:07:56 AM] Microsoft.WindowsAzure.Storage:找不到有效的帐户信息组合.
我错过了什么?Azure中是否有一些其他设置需要检查以确保正确配置此方案?
azure azure-storage-queues azure-functions azure-functions-runtime
延迟队列是一个队列,其中每个消息都有一个与之关联的延迟时间,并且只有在其延迟到期时才能获取消息.队列的头部是那个过去延迟到期的消息.如果没有延迟到期,则没有头,而dequeue将返回null.
实际上,我正在使用Azure编写云应用程序,而在Azure中,只有FIFO队列可用,而不是优先级/延迟队列.所以我来到这里看是否有人可以给我一些指示,从我可以从正确的方向开始.我google了很多,但只发现了Java中的延迟队列实现,而没有标准的教程/研究论文,一般性地谈论延迟队列.
编辑:
我有什么代码?
实际上,我必须首先设计这些东西并将它呈现给我的经理,一旦我们完成设计,那么只有我才能开始编码.
关于场景的更多细节
它是基于主/从模型的分布式应用程序.主服务器生成消息并将它们放入Azure Service Bus队列,并且有多个从服务器(在多台计算机上运行)从队列中读取并进行处理.如果主机发生故障,则其中一个从机充当主机并开始生成消息.我不想在主服务器中存储任何状态信息,因为如果主服务器关闭,所有状态信息也将随之而来.
我有一个 Node.js timerTriggerAzure 函数,它处理一个集合并将处理结果排队以供进一步处理(通过 Node.jsqueueTrigger函数)。
代码类似于以下内容:
module.exports = function (context, myTimer) {
collection.forEach(function (item) {
var items = [];
// do some work and fill 'items'
var toBeQueued = { items: items };
context.bindings.myQueue = toBeQueued;
});
context.done();
};
Run Code Online (Sandbox Code Playgroud)
这段代码只会将最后toBeQueued一个排队,而不是我要排队的每一个。
有没有办法让多个项目排队?
更新
需要明确的是,我指的是toBeQueued在 的每次迭代中对a进行排队forEach,而不仅仅是对数组进行排队。是的,Azure Functions 存在一个问题,因此我无法对数组进行排队,但我有一个解决方法;即,{ items: items }。
我使用Azure存储节点SDK将消息添加到Azure存储队列.官方例子之后,我的代码如下:
const AzureStorage = require('azure-storage');
const queueService = AzureStorage.createQueueService();
queueService.createMessage('taskqueue', 'Hello world!', function (error) {
if (!error) {
// Message inserted
}
});
Run Code Online (Sandbox Code Playgroud)
这会向taskqueue队列添加一条消息,从而触发使用Node构建的队列触发的Azure功能.当Azure函数收到消息时,它会引发以下异常:
Exception while executing function: Functions.Function2.
Microsoft.Azure.WebJobs.Host: Exception binding parameter 'queuedMessage'.
mscorlib: The input is not a valid Base-64 string as it contains a non-base
64 character, more than two padding characters, or an illegal character
among the padding characters.
Run Code Online (Sandbox Code Playgroud) 我喜欢在队列中消息到达时触发webjob的情况下更改Q消息不可见的时间跨度.
调试时我需要在dev-stage中使用它.有时由于错误而重新出现旧的Q-msg,但我已经清理了消息所引用的blob-storage-item.因此,WebJob崩溃,因为它试图获得不存在的blob-object.
如果我可以设置Q消息在1分钟后再次可见,那将是有帮助的.
public partial class函数{public static void ProcessBulkFileQ([QueueTrigger(AppConst.Q_BULKFILES)] JobInfo JobInfo,[Blob(AppConst.CONTAINER_BULKFILES +"/ {BlobName}",FileAccess.Read)] Stream InputStream,[Blob(AppConst.CONTAINER_BULKFILES + "/ {BlobName}")] CloudBlockBlob BlobToDelete){
我目前正在编写这里编写的教程,用于创建和部署队列触发的azure函数.
在第2步的"创建函数"部分中,我不清楚我们应该为"连接"字符串添加什么.我假设它是您希望函数使用的存储帐户名称.
我遇到的另一个问题是,当我在本地系统上设置并测试Azure功能时,我将其部署到Azure,并且我没有选择要使用的当前存储帐户.
我相信当我将函数发布到azure时,这会导致创建一个新的存储帐户.这非常令人沮丧,因为这意味着我必须使用具有丑陋GUID的存储帐户,并且还必须创建新的存储队列.我在某处错过了一步吗?
azure azure-storage azure-storage-queues azure-functions visual-studio-2017
我正在使用QueueTrigger处理存储队列和函数,我还在host.json中放置了BatchSize = 1.我确定一次只能发送一条消息.我想知道发送给函数的消息是否按顺序到达队列.
我有4个数据发送到队列,它有一个时间戳.我看到其中一个没有到达我用作历史记录的azure表.没想到的那个应该被发送到队列我想.
后来我向队列发送了另一条消息,但是这条消息的处理比之前发送的消息要好
我正在尝试找到一种方法来测试我拥有的一些代码,这些代码将查询天蓝色的存储队列。目前,我被要求创建自己的本地内存队列类来模拟上游 Azure 队列。此时,我试图看看是否可以在假队列中创建示例消息,以便我的类的被调用者有一些数据可以使用。
所以我正在尝试做这样的事情:
using Azure.Storage.Queues.Models;
namespace Widgets.Tests.Queues
{
public class InMemoryAzureMessageQueue : IAzureQueueClient
{
public string DequeueMessage(QueueMessage message)
{
throw new System.NotImplementedException();
}
public QueueMessage[] GetMessages()
{
//pseudocode
QueueMessage qm = new QueueMessage();
QueueMessage[] listqm = new QueueMessage[];
qm.messageID = xxx;
qm.messageBody = "hello";
listqm.add(qm);
return listqm;
}
public bool HasMesssages()
{
return true;
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试创建“qm”时,收到以下错误消息:“QueueMessage”不包含采用 0 个参数的构造函数
到目前为止我尝试过的:
我尝试在单击 QueueMessage 时“转到定义”,只是为了查看构造函数的外观。但是当我这样做时,我收到一条错误消息,指出没有找到定义。
该类的描述是这样说的:
The object returned in the QueueMessageList array when calling Get Messages on a Queue. …Run Code Online (Sandbox Code Playgroud)