Lorsque vous traitez des singletons dans Azure Functions, il y a plusieurs considérations. L'un est que l'état global est partagé entre les invocations AF. Ainsi, si une fonction est invoquée une fois puis de nouveau plus tard (assez tôt que l'hôte n'a pas déchargé votre code), l'initialisation ne se produit qu'une seule fois. Une autre considération est que AF est parfaitement libre de lancer plusieurs appels AF simultanément - donc tous les singletons doivent être threadsafe (y compris leur initialisation). Cela signifie que vous devez utiliser Lazy<T>
/AsyncLazy<T>
. Cependant, gardez à l'esprit que AF (avec ces types) conservera l'état singleton (post-initialisation) pour votre prochaine invocation même s'il échoue. Cela peut poser un problème en particulier avec le cloud computing car, en cas d'erreur de réseau (ou de configuration) au démarrage de votre FA, vous souhaitez que l'initialisation soit réitérée lors de l'appel AF suivant.
En conclusion, vous souhaitez utiliser Lazy<T>
/AsyncLazy<T>
de telle manière est threadsafe et ne conserve pas les échecs.
Avec Lazy<T>
, cela signifie you have to use the LazyThreadSafetyMode.PublicationOnly
flaget passer une fonction au constructeur (et pas seulement utiliser implicitement le constructeur par défaut pour T
). Notez que cela signifie que vous devez vous assurer que votre fonction d'initialisation elle-même est threadsafe car elle peut être exécutée par plusieurs threads simultanément.
Avec AsyncLazy<T>
, you have to use the AsyncLazyFlags.RetryOnFailure
flag. Puisque AsyncLazy<T>
est essentiellement Lazy<Task<T>>
, la tâche d'initialisation asynchrone est "partagée" entre tous les appelants simultanés, puis remplacée atomiquement par une nouvelle instance Lazy<Task<T>>
en cas d'échec. La fonction d'initialisation asynchrone n'a donc pas besoin d'être threadsafe.
Depuis l'obtention de ce bien (surtout pour plusieurs singletons) est de copier-pasteish plutôt, j'abstraire ceci pour the AF project I'm working on:
Il a fallu un certain temps pour arriver à ce point, mais je suis plutôt satisfait de la façon dont cela s'est déroulé. Je voulais aussi bloguer à ce sujet ...
L'utilisation de Lazy <> ou AsyncLazy <> avec des propriétés statiques permet d'atténuer les problèmes de threads potentiels –