Azure İşlevleri için Azure Kuyruk depolama tetikleyicisi
Kuyruk depolama tetikleyicisi, iletiler Azure Kuyruk depolamaya eklendikçe bir işlev çalıştırır.
Örnek
Kuyrukta yeni bir öğe alındığında işlev başlatmak için kuyruk tetikleyicisini kullanın. Kuyruk iletisi işleve giriş olarak sağlanır.
C# işlevi aşağıdaki C# modlarından biri kullanılarak oluşturulabilir:
- İşlem içi sınıf kitaplığı: İşlevler çalışma zamanıyla aynı işlemde çalışan derlenmiş C# işlevi.
- Yalıtılmış işlem sınıfı kitaplığı: çalışma zamanından yalıtılmış bir işlemde çalışan derlenmiş C# işlevi. .NET 5.0 üzerinde çalışan C# işlevlerini desteklemek için yalıtılmış işlem gereklidir.
- C# betiği: öncelikle Azure portal C# işlevleri oluşturulurken kullanılır.
Aşağıdaki örnekte kuyruğu yoklayan myqueue-items
ve bir kuyruk öğesi her işlendiğinde günlük yazan bir C# işlevi gösterilmektedir.
public static class QueueFunctions
{
[FunctionName("QueueTrigger")]
public static void QueueTrigger(
[QueueTrigger("myqueue-items")] string myQueueItem,
ILogger log)
{
log.LogInformation($"C# function processed: {myQueueItem}");
}
}
Aşağıdaki Java örneği, kuyruğa yerleştirilen tetiklenen iletiyi günlüğe kaydeden bir depolama kuyruğu myqueuename
tetikleyici işlevini gösterir.
@FunctionName("queueprocessor")
public void run(
@QueueTrigger(name = "msg",
queueName = "myqueuename",
connection = "myconnvarname") String message,
final ExecutionContext context
) {
context.getLogger().info(message);
}
Aşağıdaki örnekte function.json dosyasındaki bir kuyruk tetikleyici bağlaması ve bağlamayı kullanan bir JavaScript işlevi gösterilmektedir. İşlev kuyruğu yoklar myqueue-items
ve bir kuyruk öğesi her işlendiğinde bir günlük yazar.
function.json dosyası aşağıdadır:
{
"disabled": false,
"bindings": [
{
"type": "queueTrigger",
"direction": "in",
"name": "myQueueItem",
"queueName": "myqueue-items",
"connection":"MyStorageConnectionAppSetting"
}
]
}
Yapılandırma bölümünde bu özellikler açıklanır.
Not
ad parametresi, kuyruk öğesi yükünü içeren JavaScript kodunda olduğu gibi context.bindings.<name>
yansıtılmıştır. Bu yük, işleve ikinci parametre olarak da geçirilir.
JavaScript kodu şu şekildedir:
module.exports = async function (context, message) {
context.log('Node.js queue trigger function processed work item', message);
// OR access using context.bindings.<name>
// context.log('Node.js queue trigger function processed work item', context.bindings.myQueueItem);
context.log('expirationTime =', context.bindingData.expirationTime);
context.log('insertionTime =', context.bindingData.insertionTime);
context.log('nextVisibleTime =', context.bindingData.nextVisibleTime);
context.log('id =', context.bindingData.id);
context.log('popReceipt =', context.bindingData.popReceipt);
context.log('dequeueCount =', context.bindingData.dequeueCount);
};
Kullanım bölümünde, function.json dosyasındaki name
özelliği tarafından adlandırılan açıklanmaktadırmyQueueItem
. İleti meta verileri bölümünde gösterilen diğer tüm değişkenler açıklanmaktadır.
Aşağıdaki örnekte, bir işleve tetikleyici aracılığıyla iletilen kuyruk iletisinin nasıl okunduğu gösterilmektedir.
Depolama kuyruğu tetikleyicisi function.json dosyasında tanımlanır ve burada type
olarak queueTrigger
ayarlanır.
{
"bindings": [
{
"name": "QueueItem",
"type": "queueTrigger",
"direction": "in",
"queueName": "messages",
"connection": "MyStorageConnectionAppSetting"
}
]
}
Run.ps1 dosyasındaki kod, işlevinizdeki kuyruk iletisini okumanızı sağlayan parametresini olarak $QueueItem
bildirir.
# Input bindings are passed in via param block.
param([string] $QueueItem, $TriggerMetadata)
# Write out the queue message and metadata to the information log.
Write-Host "PowerShell queue trigger function processed work item: $QueueItem"
Write-Host "Queue item expiration time: $($TriggerMetadata.ExpirationTime)"
Write-Host "Queue item insertion time: $($TriggerMetadata.InsertionTime)"
Write-Host "Queue item next visible time: $($TriggerMetadata.NextVisibleTime)"
Write-Host "ID: $($TriggerMetadata.Id)"
Write-Host "Pop receipt: $($TriggerMetadata.PopReceipt)"
Write-Host "Dequeue count: $($TriggerMetadata.DequeueCount)"
Aşağıdaki örnekte, bir işleve tetikleyici aracılığıyla iletilen kuyruk iletisinin nasıl okunduğu gösterilmektedir.
function.json dosyasında türü olarak ayarlanmış queueTrigger
bir Depolama kuyruğu tetikleyicisi tanımlanır.
{
"scriptFile": "__init__.py",
"bindings": [
{
"name": "msg",
"type": "queueTrigger",
"direction": "in",
"queueName": "messages",
"connection": "AzureStorageQueuesConnectionString"
}
]
}
_init_.py kodu, işlevinizdeki kuyruk iletisini okumanızı sağlayan parametresini olarak func.QueueMessage
bildirir.
import logging
import json
import azure.functions as func
def main(msg: func.QueueMessage):
logging.info('Python queue trigger function processed a queue item.')
result = json.dumps({
'id': msg.id,
'body': msg.get_body().decode('utf-8'),
'expiration_time': (msg.expiration_time.isoformat()
if msg.expiration_time else None),
'insertion_time': (msg.insertion_time.isoformat()
if msg.insertion_time else None),
'time_next_visible': (msg.time_next_visible.isoformat()
if msg.time_next_visible else None),
'pop_receipt': msg.pop_receipt,
'dequeue_count': msg.dequeue_count
})
logging.info(result)
Öznitelikler
hem işlem içi hem de yalıtılmış işlem C# kitaplıkları, işlevi tanımlamak için QueueTriggerAttribute kullanır. C# betiği bunun yerine function.json yapılandırma dosyasını kullanır.
C# sınıf kitaplıklarında özniteliğin oluşturucu, aşağıdaki örnekte gösterildiği gibi izlenecek kuyruğun adını alır:
[FunctionName("QueueTrigger")]
public static void Run(
[QueueTrigger("myqueue-items")] string myQueueItem,
ILogger log)
{
...
}
Özelliğini, aşağıdaki örnekte gösterildiği gibi kullanılacak depolama hesabı bağlantı dizesini içeren uygulama ayarını belirtecek şekilde ayarlayabilirsiniz Connection
:
[FunctionName("QueueTrigger")]
public static void Run(
[QueueTrigger("myqueue-items", Connection = "StorageConnectionAppSetting")] string myQueueItem,
ILogger log)
{
....
}
Ek Açıklamalar
Ek QueueTrigger
açıklama işlevi tetikleyen kuyruğa erişmenizi sağlar. Aşağıdaki örnek, kuyruk iletisini parametresi aracılığıyla message
işlev için kullanılabilir hale getirir.
package com.function;
import com.microsoft.azure.functions.annotation.*;
import java.util.Queue;
import com.microsoft.azure.functions.*;
public class QueueTriggerDemo {
@FunctionName("QueueTriggerDemo")
public void run(
@QueueTrigger(name = "message", queueName = "messages", connection = "MyStorageConnectionAppSetting") String message,
final ExecutionContext context
) {
context.getLogger().info("Queue message: " + message);
}
}
Özellik | Açıklama |
---|---|
name |
İşlev imzasında parametre adını bildirir. İşlev tetiklendiğinde, bu parametrenin değeri kuyruk iletisinin içeriğine sahiptir. |
queueName |
Depolama hesabında kuyruk adını bildirir. |
connection |
Depolama hesabı bağlantı dizesini gösterir. |
Yapılandırma
Aşağıdaki tabloda function.json dosyasında ayarladığınız bağlama yapılandırma özellikleri ve QueueTrigger
özniteliği açıklanmaktadır.
function.json özelliği | Açıklama |
---|---|
Türü | olarak ayarlanmalıdır queueTrigger . Tetikleyiciyi Azure portal oluşturduğunuzda bu özellik otomatik olarak ayarlanır. |
Yön | Yalnızca function.json dosyasında. olarak ayarlanmalıdır in . Tetikleyiciyi Azure portal oluşturduğunuzda bu özellik otomatik olarak ayarlanır. |
Adı | İşlev kodunda kuyruk öğesi yükünü içeren değişkenin adı. |
queueName | Yoklama için kuyruğun adı. |
bağlantı | Azure Kuyruklarına nasıl bağlanıldığını belirten bir uygulama ayarının veya ayar koleksiyonunun adı. Bkz. Bağlantılar. |
Tam örnekler için Örnek bölümüne bakın.
Yerel olarak geliştirme yaparken uygulama ayarlarınızı koleksiyondaki local.settings.json dosyasınaValues
ekleyin.
Kullanım
Not
İşlevler base64 ile kodlanmış bir dize bekler. Kodlama türündeki tüm ayarlamaların ( verileri base64 kodlamalı dize olarak hazırlamak için) çağrı hizmetinde uygulanması gerekir.
Kuyruk tetikleyicisinin kullanımı uzantı paketi sürümüne ve işlev uygulamanızda kullanılan C# modalitesine bağlıdır ve bu da aşağıdakilerden biri olabilir:
İşlem içi sınıf kitaplığı, İşlevler çalışma zamanıyla aynı işlemde çalıştırılan derlenmiş bir C# işlevidir.
Modun ve sürümün kullanım ayrıntılarını görmek için bir sürüm seçin.
gibi string paramName
bir yöntem parametresi kullanarak ileti verilerine erişin. paramName
, QueueTriggerAttribute içinde belirtilen değerdir. Aşağıdaki türlerden herhangi birine bağlanabilirsiniz:
- Düz eski CLR nesnesi (POCO)
string
byte[]
- QueueMessage
İşlevler çalışma zamanı bir nesneye bağlanırken JSON yükünün seri durumdan çıkararak kodunuzda tanımlanan rastgele bir sınıfın örneğine dönüştürmeyi dener. QueueMessage kullanan örnekler için uzantının GitHub deposuna bakın.
Özniteliği bir Connection
özellik alırken depolama hesabı bağlantısı belirtmek için StorageAccountAttribute'u da kullanabilirsiniz. Kitaplıktaki diğer işlevlerden farklı bir depolama hesabı kullanmanız gerektiğinde bunu yapabilirsiniz. Oluşturucu, depolama bağlantı dizesi içeren bir uygulama ayarının adını alır. özniteliği parametre, yöntem veya sınıf düzeyinde uygulanabilir. Aşağıdaki örnekte sınıf düzeyi ve yöntem düzeyi gösterilmektedir:
[StorageAccount("ClassLevelStorageAppSetting")]
public static class AzureFunctions
{
[FunctionName("StorageTrigger")]
[StorageAccount("FunctionLevelStorageAppSetting")]
public static void Run( //...
{
...
}
Kullanılacak depolama hesabı aşağıdaki sırayla belirlenir:
- Tetikleyici veya bağlama özniteliğinin
Connection
özelliği. - Tetikleyici
StorageAccount
veya bağlama özniteliğiyle aynı parametreye uygulanan öznitelik. StorageAccount
İşleve uygulanan öznitelik.StorageAccount
sınıfına uygulanan öznitelik.- uygulama ayarında
AzureWebJobsStorage
tanımlanan işlev uygulaması için varsayılan depolama hesabı.
QueueTrigger ek açıklaması, işlevi tetikleyen kuyruk iletisine erişmenizi sağlar.
Kuyruk öğesi yükü aracılığıyla kullanılabilir context.bindings.<NAME>
; burada <NAME>
function.json dosyasında tanımlanan adla eşleşir. Yük JSON ise, değer bir nesnede seri durumdan çıkarılır.
function.json dosyasında bağlamanın name
parametresi tarafından belirlenen adla eşleşen dize parametresi aracılığıyla kuyruk iletisine erişin.
QueueMessage olarak yazılan parametre aracılığıyla kuyruk iletisine erişin.
Meta veri
Kuyruk tetikleyicisi çeşitli meta veri özellikleri sağlar. Bu özellikler, diğer bağlamalardaki bağlama ifadelerinin bir parçası olarak veya kodunuzdaki parametreler olarak kullanılabilir.
Özellikler CloudQueueMessage sınıfının üyeleridir.
Özellik | Tür | Açıklama |
---|---|---|
QueueTrigger |
string |
Kuyruk yükü (geçerli bir dizeyse). Kuyruk iletisi yükü bir dizeyse, QueueTrigger function.json dosyasındaki özelliği tarafından adlandırılan değişkenle aynı değere name sahiptir. |
DequeueCount |
int |
Bu iletinin kaç kez sıralandığı. |
ExpirationTime |
DateTimeOffset |
İletinin süresi dolduğunda. |
Id |
string |
Kuyruk iletisi kimliği. |
InsertionTime |
DateTimeOffset |
İletinin kuyruğa eklenme zamanı. |
NextVisibleTime |
DateTimeOffset |
İletinin bir sonraki görünür olacağı zaman. |
PopReceipt |
string |
İletinin pop makbuzu. |
Bağlantılar
connection
özelliği, uygulamanın Azure Kuyruklarına nasıl bağlanacaklarını belirten bir ortam yapılandırması başvurusudur. Şunları belirtebilir:
- Bağlantı dizesi içeren bir uygulama ayarının adı
- Birden çok uygulama ayarı için paylaşılan ön ekin adı ve kimlik tabanlı bağlantı tanımlama.
Yapılandırılan değer hem tek bir ayar için tam eşleşme hem de diğer ayarlar için bir ön ek eşleşmesi ise, tam eşleşme kullanılır.
Bağlantı dizesi
Bağlantı dizesi almak için Depolama hesabı erişim anahtarlarını yönetme bölümünde gösterilen adımları izleyin.
Bu bağlantı dizesi, bağlama yapılandırmasının özelliği tarafından connection
belirtilen değerle eşleşen bir adla bir uygulama ayarında depolanmalıdır.
Uygulama ayarı adı "AzureWebJobs" ile başlıyorsa, adın yalnızca kalanını burada belirtebilirsiniz. Örneğin, "MyStorage" olarak ayarlarsanızconnection
, İşlevler çalışma zamanı "AzureWebJobsMyStorage" adlı bir uygulama ayarı arar. Boş bırakırsanızconnection
, İşlevler çalışma zamanı adlı AzureWebJobsStorage
uygulama ayarında varsayılan Depolama bağlantı dizesini kullanır.
Kimlik tabanlı bağlantılar
Uzantının 5.x veya üzeri bir sürümünü kullanıyorsanız, gizli dizi içeren bir bağlantı dizesi kullanmak yerine uygulamanın Azure Active Directory kimliği kullanmasını sağlayabilirsiniz. Bunu yapmak için, tetikleyici ve bağlama yapılandırmasındaki özelliğiyle connection
eşlenen ortak bir ön ek altında ayarları tanımlarsınız.
"AzureWebJobsStorage" olarak ayarlanıyorsanız connection
bkz. Kimlikle konak depolamaya bağlanma. Diğer tüm bağlantılar için uzantı aşağıdaki özellikleri gerektirir:
Özellik | Ortam değişkeni şablonu | Açıklama | Örnek değer |
---|---|---|---|
Kuyruk Hizmeti URI'si | <CONNECTION_NAME_PREFIX>__queueServiceUri 1 |
HTTPS şemasını kullanarak bağlandığınız kuyruk hizmetinin veri düzlemi URI'si. | <https:// storage_account_name.queue.core.windows.net> |
1<CONNECTION_NAME_PREFIX>__serviceUri
diğer ad olarak kullanılabilir. Her iki form da sağlanırsa, queueServiceUri
form kullanılır. Genel serviceUri
bağlantı yapılandırması bloblar, kuyruklar ve/veya tablolar arasında kullanılacaksa form kullanılamaz.
Bağlantıyı özelleştirmek için ek özellikler ayarlanabilir. Bkz. Kimlik tabanlı bağlantılar için ortak özellikler.
Azure İşlevleri hizmetinde barındırıldığında, kimlik tabanlı bağlantılar yönetilen kimlik kullanır. Sistem tarafından atanan kimlik varsayılan olarak kullanılır, ancak kullanıcı tarafından atanan kimlik ve clientID
özellikleriyle credential
belirtilebilir. Kullanıcı tarafından atanan kimliği kaynak kimliğiyle yapılandırmanın desteklenmediğini unutmayın. Yerel geliştirme gibi başka bağlamlarda çalıştırıldığında, bunun yerine geliştirici kimliğiniz kullanılır, ancak bu özelleştirilebilir. Bkz. Kimlik tabanlı bağlantılarla yerel geliştirme.
Kimliğe izin verme
Kullanılan kimlik, hedeflenen eylemleri gerçekleştirmek için izinlere sahip olmalıdır. Bu izinleri sağlayan yerleşik veya özel rolleri kullanarak Azure RBAC'de bir rol atamanız gerekir.
Önemli
Bazı izinler hedef hizmet tarafından tüm bağlamlar için gerekli olmayan şekilde gösterilebilir. Mümkün olduğunda, en az ayrıcalık ilkesine bağlı kalarak kimliğe yalnızca gerekli ayrıcalıkları verin. Örneğin, uygulamanın yalnızca bir veri kaynağından okuyabilmesi gerekiyorsa, yalnızca okuma izni olan bir rol kullanın. Okuma işlemi için aşırı izin olduğundan, söz konusu hizmete yazmaya izin veren bir rol atamak uygun olmaz. Benzer şekilde, rol atamasının kapsamının yalnızca okunması gereken kaynaklar üzerinde olduğundan emin olmak istersiniz.
Çalışma zamanında kuyruğunuza erişim sağlayan bir rol ataması oluşturmanız gerekir. Sahip gibi yönetim rolleri yeterli değildir. Aşağıdaki tabloda, Kuyruk Depolama uzantısı normal işlemde kullanılırken önerilen yerleşik roller gösterilmektedir. Uygulamanız, yazdığınız koda göre ek izinler gerektirebilir.
Bağlama türü | Örnek yerleşik roller |
---|---|
Tetikleyici | Kuyruk Veri Okuyucusu Depolama Depolama Kuyruk Veri İletisi İşlemcisi |
Çıkış bağlaması | Kuyruk Verileri Katkıda Bulunanı,Depolama KuyrukVeri İletisi Göndereni Depolama |
Zehirli iletiler
Bir kuyruk tetikleyici işlevi başarısız olduğunda, Azure İşlevleri ilk deneme dahil olmak üzere belirli bir kuyruk iletisi için işlevi en fazla beş kez yeniden dener. Beş denemenin tümü başarısız olursa, işlev çalışma zamanı originalqueuename-poison> adlı< kuyruğa bir ileti ekler. Zehir kuyruğundan gelen iletileri günlüğe kaydederek veya el ile dikkat gerektiğini belirten bir bildirim göndererek işlemek için bir işlev yazabilirsiniz.
Zehirli iletileri el ile işlemek için kuyruk iletisinin dequeueCount öğesini denetleyin.
Kilitle göz atma
Peek-lock düzeni, kuyruk tetikleyicileri için otomatik olarak gerçekleşir. İletiler sorgudan kaldırıldığında görünmez olarak işaretlenir ve Depolama hizmeti tarafından yönetilen bir zaman aşımıyla ilişkilendirilir.
İşlev başlatıldığında, aşağıdaki koşullarda bir iletiyi işlemeye başlar.
- İşlev başarılı olursa işlev yürütmesi tamamlanır ve ileti silinir.
- İşlev başarısız olursa ileti görünürlüğü sıfırlanır. Sıfırlandıktan sonra, işlev yeni bir ileti istediğinde ileti yeniden işlenir.
- Kilitlenme nedeniyle işlev hiçbir zaman tamamlanmazsa, ileti görünürlüğünün süresi dolar ve ileti kuyrukta yeniden görüntülenir.
Tüm görünürlük mekanizmaları İşlevler çalışma zamanı tarafından değil Depolama hizmeti tarafından işlenir.
Yoklama algoritması
Kuyruk tetikleyicisi, boşta kuyruk yoklamasının depolama işlemi maliyetleri üzerindeki etkisini azaltmak için rastgele bir üstel geri alma algoritması uygular.
Algoritma aşağıdaki mantığı kullanır:
- bir ileti bulunduğunda, çalışma zamanı 100 milisaniye bekler ve sonra başka bir iletiyi denetler
- İleti bulunamadığında, yeniden denemeden önce yaklaşık 200 milisaniye bekler.
- Sonraki başarısız kuyruk iletisi alma denemelerinden sonra, bekleme süresi varsayılan olarak bir dakika olan maksimum bekleme süresine ulaşana kadar artmaya devam eder.
- Maksimum bekleme süresi, host.json dosyasındaki özelliği aracılığıyla
maxPollingInterval
yapılandırılabilir.
Yerel geliştirme için maksimum yoklama aralığı varsayılan olarak iki saniyedir.
Not
Tüketim planında işlev uygulamalarını barındırırken faturalamayla ilgili olarak, çalışma zamanı tarafından yoklama için harcanan süre için ücret alınmaz.
Eşzamanlılık
Bekleyen birden çok kuyruk iletisi olduğunda, kuyruk tetikleyicisi bir dizi ileti alır ve bunları işlemek için işlev örneklerini eşzamanlı olarak çağırır. Varsayılan olarak toplu iş boyutu 16'dır. İşlenen sayı 8'e indiğinde, çalışma zamanı başka bir toplu iş alır ve bu iletileri işlemeye başlar. Bu nedenle, bir sanal makinede (VM) işlev başına işlenen eşzamanlı ileti sayısı üst sınırı 24'tür. Bu sınır, her VM'de kuyruk tarafından tetiklenen her işlev için ayrı ayrı geçerlidir. İşlev uygulamanızın ölçeği birden çok VM'ye genişletilirse, her VM tetikleyicileri bekler ve işlevleri çalıştırmayı dener. Örneğin, bir işlev uygulamasının ölçeği 3 VM'ye genişletilirse, kuyrukla tetiklenen bir işlevin varsayılan eş zamanlı örnek sayısı üst sınırı 72'dir.
Toplu iş boyutu ve yeni toplu iş alma eşiği host.json dosyasında yapılandırılabilir. Bir işlev uygulamasında kuyrukla tetiklenen işlevler için paralel yürütmeyi en aza indirmek istiyorsanız, toplu iş boyutunu 1 olarak ayarlayabilirsiniz. Bu ayar, işlev uygulamanız tek bir sanal makinede (VM) çalıştığı sürece eşzamanlılığı ortadan kaldırır.
Kuyruk tetikleyicisi, bir işlevin bir kuyruk iletisini aynı anda birden çok kez işlemesini otomatik olarak engeller.
host.json özellikleri
host.json dosyası, kuyruk tetikleyici davranışını denetleen ayarlar içerir. Kullanılabilir ayarlarla ilgili ayrıntılar için host.json ayarları bölümüne bakın.