Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Azure Service Bus es un servicio de mensajería en la nube de alta confianza de Microsoft.
Utilice la biblioteca @azure/service-bus cliente de la aplicación para
- Envío de mensajes a una cola o un tema de Azure Service Bus
- Recepción de mensajes de una cola o suscripción de Azure Service Bus
- Crear/obtener/eliminar/actualizar/enumerar colas/temas/suscripciones/reglas en un espacio de nombres de Azure Service Bus.
Recursos para la @azure/service-bus versión 7:
Vínculos clave:
- Código fuente
- Paquete (npm)
- documentación de referencia de api de
- Documentación del producto
- Ejemplos
- Guía de solución de problemas
NOTA: Si utiliza la versión 1.1.10 o inferior y desea migrar a la versión más reciente de este paquete, consulte nuestra guía de migración para pasar de Service Bus V1 a Service Bus V7
Cómo empezar
Instalar el paquete
Instale la versión más reciente de la biblioteca cliente de Azure Service Bus mediante npm.
npm install @azure/service-bus
Entornos admitidos actualmente
Prerequisites
Configurar TypeScript
Los usuarios de TypeScript deben tener instaladas definiciones de tipo de nodo:
npm install @types/node
También debe habilitar compilerOptions.allowSyntheticDefaultImports en el tsconfig.json. Tenga en cuenta que si ha habilitado compilerOptions.esModuleInterop, allowSyntheticDefaultImports está habilitado de forma predeterminada. Consulte manual de opciones del compilador de TypeScript para obtener más información.
Paquete de JavaScript
Para usar esta biblioteca cliente en el explorador, primero debe usar un agrupador. Para obtener más información sobre cómo hacerlo, consulte nuestra documentación de agrupación de .
Además de lo que se describe allí, esta biblioteca también necesita polyfills adicionales para los siguientes módulos incorporados del núcleo de NodeJS para que funcione correctamente en los navegadores:
bufferospathprocess
Agrupación con Webpack
Si usa Webpack v5, puede instalar las siguientes dependencias de desarrollo
npm install --save-dev os-browserify path-browserify
A continuación, añade lo siguiente a tu webpack.config.js
const path = require("path");
+const webpack = require("webpack");
module.exports = {
entry: "./src/index.ts",
@@ -12,8 +13,21 @@ module.exports = {
},
],
},
+ plugins: [
+ new webpack.ProvidePlugin({
+ process: "process/browser",
+ }),
+ new webpack.ProvidePlugin({
+ Buffer: ["buffer", "Buffer"],
+ }),
+ ],
resolve: {
extensions: [".ts", ".js"],
+ fallback: {
+ buffer: require.resolve("buffer/"),
+ os: require.resolve("os-browserify"),
+ path: require.resolve("path-browserify"),
+ },
},
Agrupación con Rollup
Si usa Rollup Bundler, instale las siguientes dependencias de desarrollo
npm install --save-dev @rollup/plugin-commonjs @rollup/plugin-inject @rollup/plugin-node-resolve
A continuación, incluya lo siguiente en su rollup.config.js
+import nodeResolve from "@rollup/plugin-node-resolve";
+import cjs from "@rollup/plugin-commonjs";
+import shim from "rollup-plugin-shim";
+import inject from "@rollup/plugin-inject";
export default {
// other configs
plugins: [
+ shim({
+ fs: `export default {}`,
+ net: `export default {}`,
+ tls: `export default {}`,
+ path: `export default {}`,
+ dns: `export function resolve() { }`,
+ }),
+ nodeResolve({
+ mainFields: ["module", "browser"],
+ preferBuiltins: false,
+ }),
+ cjs(),
+ inject({
+ modules: {
+ Buffer: ["buffer", "Buffer"],
+ process: "process",
+ },
+ exclude: ["./**/package.json"],
+ }),
]
};
Consulte la documentación de su empaquetador favorito para obtener más información sobre el uso de polyfills.
Soporte nativo de React
Al igual que los navegadores, React Native no es compatible con algunas API de JavaScript utilizadas por esta biblioteca SDK, por lo que debe proporcionar polyfills para ellos. Consulte el ejemplo de mensajería React Native con Expo para obtener más detalles.
Autenticar el cliente
La interacción con Service Bus comienza con una instancia de la clase ServiceBusClient . Puede autenticarse en Service Bus mediante una cadena de conexión o mediante una credencial de Azure Active Directory.
Uso de una cadena de conexión
Este método toma la cadena de conexión a la instancia de Service Bus. Puede obtener la cadena de conexión desde Azure Portal.
import { ServiceBusClient } from "@azure/service-bus";
const serviceBusClient = new ServiceBusClient("<connectionString>");
Hay más información disponible sobre este constructor en la documentación de la API.
Uso de una credencial de Azure Active Directory
La autenticación con Azure Active Directory usa la biblioteca de identidad de Azure.
En el ejemplo siguiente se usa DefaultAzureCredential, uno de los muchos proveedores de credenciales disponibles en la @azure/identity biblioteca.
import { DefaultAzureCredential } from "@azure/identity";
import { ServiceBusClient } from "@azure/service-bus";
const fullyQualifiedNamespace = "<name-of-service-bus-namespace>.servicebus.windows.net";
const credential = new DefaultAzureCredential();
const serviceBusClient = new ServiceBusClient(fullyQualifiedNamespace, credential);
NOTA: Si usa su propia implementación de la
TokenCredentialinterfaz en AAD, establezca los "ámbitos" del bus de servicio en lo siguiente para obtener el token adecuado:
["https://servicebus.azure.net//user_impersonation"];
Hay más información disponible sobre este constructor en la documentación de la API
Conceptos clave
Una vez que haya inicializado un ServiceBusClient, puede interactuar con estos recursos dentro de un espacio de nombres de Service Bus:
- Colas: Permite enviar y recibir mensajes. A menudo se utiliza para la comunicación punto a punto.
- Temas: A diferencia de las colas, los temas son más adecuados para escenarios de publicación/suscripción. Un tema se puede enviar a, pero requiere una suscripción, de la cual puede haber varios en paralelo, para consumir.
- Suscripciones: el mecanismo para consumir de un tema. Cada suscripción es independiente y recibe una copia de cada mensaje enviado al tema. Las reglas y los filtros se pueden usar para personalizar los mensajes que recibe una suscripción específica.
Para obtener más información sobre estos recursos, consulte ¿Qué es Azure Service Bus?.
Para interactuar con estos recursos, se debe estar familiarizado con los siguientes conceptos del SDK:
- Envíe mensajes, a una cola o tema, utilizando un
ServiceBusSenderServiceBusClient.createSender()archivo . - Reciba mensajes, ya sea de una cola o de una suscripción, mediante un
ServiceBusReceiverServiceBusClient.createReceiver()archivo . - Reciba mensajes, de colas o suscripciones habilitadas para sesión, mediante un
ServiceBusSessionReceiverarchivoServiceBusClient.acceptSession()ServiceBusClient.acceptNextSession().
Tenga en cuenta que las colas, los temas y las suscripciones deben crearse antes de usar esta biblioteca.
Examples
En las secciones siguientes se proporcionan fragmentos de código que cubren algunas de las tareas comunes mediante Azure Service Bus
- Envío de mensajes
- Recepción de mensajes
- Resolver un mensaje
- Colas de mensajes fallidos
- Enviar mensajes mediante sesiones
- Recibir mensajes de sesiones
- Sesiones de mensajes de lista
- Administración de recursos de un espacio de nombres de Service Bus
- Ejemplos adicionales
Enviar mensajes
Una vez que haya creado una instancia de una ServiceBusClient clase, puede obtener una ServiceBusSender utilizando el método createSender que puede usar para enviar mensajes.
import { DefaultAzureCredential } from "@azure/identity";
import { ServiceBusClient } from "@azure/service-bus";
const fullyQualifiedNamespace = "<name-of-service-bus-namespace>.servicebus.windows.net";
const credential = new DefaultAzureCredential();
const serviceBusClient = new ServiceBusClient(fullyQualifiedNamespace, credential);
const sender = serviceBusClient.createSender("my-queue");
const messages = [
{ body: "Albert Einstein" },
{ body: "Werner Heisenberg" },
{ body: "Marie Curie" },
{ body: "Steven Hawking" },
{ body: "Isaac Newton" },
{ body: "Niels Bohr" },
{ body: "Michael Faraday" },
{ body: "Galileo Galilei" },
{ body: "Johannes Kepler" },
{ body: "Nikolaus Kopernikus" },
];
// sending a single message
await sender.sendMessages(messages[0]);
// sending multiple messages in a single call
// this will fail if the messages cannot fit in a batch
await sender.sendMessages(messages);
// Sends multiple messages using one or more ServiceBusMessageBatch objects as required
let batch = await sender.createMessageBatch();
for (let i = 0; i < messages.length; i++) {
const message = messages[i];
if (!batch.tryAddMessage(message)) {
// Send the current batch as it is full and create a new one
await sender.sendMessages(batch);
batch = await sender.createMessageBatch();
if (!batch.tryAddMessage(messages[i])) {
throw new Error("Message too big to fit in a batch");
}
}
}
// Send the batch
await sender.sendMessages(batch);
Recepción de mensajes
Una vez que haya creado una instancia de una ServiceBusClient clase, puede obtener una ServiceBusReceiver mediante el método createReceiver .
import { DefaultAzureCredential } from "@azure/identity";
import { ServiceBusClient } from "@azure/service-bus";
const fullyQualifiedNamespace = "<name-of-service-bus-namespace>.servicebus.windows.net";
const credential = new DefaultAzureCredential();
const serviceBusClient = new ServiceBusClient(fullyQualifiedNamespace, credential);
const receiver = serviceBusClient.createReceiver("my-queue");
Hay dos receiveModes disponibles.
- "peekLock": en el modo peekLock, el receptor tiene un bloqueo en el mensaje durante el tiempo especificado en la cola.
- "receiveAndDelete": en el modo receiveAndDelete, los mensajes se eliminan del Bus de servicio a medida que se reciben.
Si receiveMode no se proporciona en las opciones, el valor predeterminado es el modo "peekLock". También puede liquidar los mensajes recibidos en el modo "peekLock".
Puede utilizar este receptor de una de las 3 formas de recibir mensajes:
Obtener una matriz de mensajes
Utilice la función receiveMessages , que devuelve una promesa que se resuelve en una matriz de mensajes.
import { DefaultAzureCredential } from "@azure/identity";
import { ServiceBusClient } from "@azure/service-bus";
const fullyQualifiedNamespace = "<name-of-service-bus-namespace>.servicebus.windows.net";
const credential = new DefaultAzureCredential();
const serviceBusClient = new ServiceBusClient(fullyQualifiedNamespace, credential);
const receiver = serviceBusClient.createReceiver("my-queue");
const myMessages = await receiver.receiveMessages(10);
Suscribirse mediante un controlador de mensajes
Use el método subscribe para configurar controladores de mensajes y tenerlo en ejecución todo el tiempo que necesite.
Cuando haya terminado, llame receiver.close() para dejar de recibir más mensajes.
import { DefaultAzureCredential } from "@azure/identity";
import { ServiceBusClient } from "@azure/service-bus";
const fullyQualifiedNamespace = "<name-of-service-bus-namespace>.servicebus.windows.net";
const credential = new DefaultAzureCredential();
const serviceBusClient = new ServiceBusClient(fullyQualifiedNamespace, credential);
const receiver = serviceBusClient.createReceiver("my-queue");
const myMessageHandler = async (message) => {
// your code here
console.log(`message.body: ${message.body}`);
};
const myErrorHandler = async (args) => {
console.log(
`Error occurred with ${args.entityPath} within ${args.fullyQualifiedNamespace}: `,
args.error,
);
};
receiver.subscribe({
processMessage: myMessageHandler,
processError: myErrorHandler,
});
Uso de un iterador asincrónico
Use getMessageIterator para obtener un iterador asincrónico sobre los mensajes
import { DefaultAzureCredential } from "@azure/identity";
import { ServiceBusClient } from "@azure/service-bus";
const fullyQualifiedNamespace = "<name-of-service-bus-namespace>.servicebus.windows.net";
const credential = new DefaultAzureCredential();
const serviceBusClient = new ServiceBusClient(fullyQualifiedNamespace, credential);
const receiver = serviceBusClient.createReceiver("my-queue");
for await (const message of receiver.getMessageIterator()) {
// your code here
}
Resolver un mensaje
Una vez que reciba un mensaje, puede llamar a completeMessage(), abandonMessage()deferMessage() o deadLetterMessage() al receptor en función de cómo desee liquidar el mensaje.
Para obtener más información, lea Liquidación de mensajes recibidos
Colas de mensajes fallidos
La cola de mensajes fallidos es una subcola. Cada cola o suscripción tiene su propia cola de mensajes fallidos. Las colas de mensajes fallidos almacenan mensajes que se han enviado explícitamente como mensajes fallidos (a través receiver.deadLetterMessage()de ) o mensajes que han superado su número máximo de entregas.
La creación de un receptor para una subcola de mensajes fallidos es similar a la creación de un receptor para una suscripción o cola:
import { DefaultAzureCredential } from "@azure/identity";
import { ServiceBusClient } from "@azure/service-bus";
const fullyQualifiedNamespace = "<name-of-service-bus-namespace>.servicebus.windows.net";
const credential = new DefaultAzureCredential();
const serviceBusClient = new ServiceBusClient(fullyQualifiedNamespace, credential);
// To receive from a queue's dead letter sub-queue
const deadLetterReceiverForQueue = serviceBusClient.createReceiver("queue", {
subQueueType: "deadLetter",
});
// To receive from a subscription's dead letter sub-queue
const deadLetterReceiverForSubscription = serviceBusClient.createReceiver("topic", "subscription", {
subQueueType: "deadLetter",
});
// Dead letter receivers work like any other receiver connected to a queue
// ex:
const messages = await deadLetterReceiverForQueue.receiveMessages(5);
for (const message of messages) {
console.log(`Dead lettered message: ${message.body}`);
}
Ejemplos completos que demuestran las colas de mensajes fallidos de forma más exhaustiva:
- Usar receiver.deadLetterMessage() para enviar mensajes explícitamente a la subcola de mensajes fallidos
- Recepción de mensajes de la subcola de mensajes fallidos
Enviar mensajes mediante sesiones
El uso de sesiones requiere la creación de una cola o suscripción habilitada para la sesión. Puede obtener más información sobre cómo configurar esta función en el portal aquí.
Para enviar mensajes a una sesión, use el ServiceBusClient para crear un remitente usando createSender.
Al enviar el mensaje, establezca la sessionId propiedad en el mensaje para asegurarse de que el mensaje llegue a la sesión correcta.
import { DefaultAzureCredential } from "@azure/identity";
import { ServiceBusClient } from "@azure/service-bus";
const fullyQualifiedNamespace = "<name-of-service-bus-namespace>.servicebus.windows.net";
const credential = new DefaultAzureCredential();
const serviceBusClient = new ServiceBusClient(fullyQualifiedNamespace, credential);
const sender = serviceBusClient.createSender("my-session-queue");
await sender.sendMessages({
body: "my-message-body",
sessionId: "my-session",
});
Puedes leer más sobre cómo funcionan las sesiones aquí.
Recibir mensajes de sesiones
El uso de sesiones requiere la creación de una cola o suscripción habilitada para la sesión. Puede obtener más información sobre cómo configurar esta función en el portal aquí.
A diferencia de las colas o suscripciones no habilitadas para sesión, solo un único receptor puede leer una sesión en cualquier momento. Esto se aplica mediante el bloqueo de una sesión, que es controlada por Service Bus. Conceptualmente, esto es similar a cómo funciona el bloqueo de mensajes cuando se usa peekLock el modo: cuando un mensaje (o sesión) está bloqueado, su receptor tiene acceso exclusivo a él.
Para abrir y bloquear una sesión, use una instancia de ServiceBusClient para crear un SessionReceiver.
Hay dos formas de elegir qué sesión abrir:
Especifique un
sessionId, que bloquea una sesión con nombre.const receiver = await serviceBusClient.acceptSession("my-session-queue", "my-session");No especifique un ID de sesión. En este caso, Service Bus buscará la siguiente sesión disponible que aún no esté bloqueada.
const receiver = await serviceBusClient.acceptNextSession("my-session-queue");Puede encontrar el nombre de la sesión a través de la
sessionIdpropiedad en elSessionReceiverarchivo . Si receiveMode no se proporciona en las opciones, el valor predeterminado es el modo "peekLock". También puede liquidar los mensajes recibidos en el modo "peekLock".
Una vez creado el receptor, puede elegir entre 3 formas de recibir mensajes:
- Obtener una matriz de mensajes
- Suscribirse mediante un controlador de mensajes
- Uso de un iterador asincrónico
Puedes leer más sobre cómo funcionan las sesiones aquí.
Sesiones de mensajes de lista
Para descubrir qué sesiones tienen mensajes activos o estado de sesión en una cola o suscripción, utiliza listMessageSessions():
import { DefaultAzureCredential } from "@azure/identity";
import { ServiceBusClient } from "@azure/service-bus";
const fullyQualifiedNamespace = "<name-of-service-bus-namespace>.servicebus.windows.net";
const credential = new DefaultAzureCredential();
const serviceBusClient = new ServiceBusClient(fullyQualifiedNamespace, credential);
// List all sessions with active messages or session state in a queue
for await (const sessionId of serviceBusClient.listMessageSessions("my-session-queue")) {
console.log("Session ID:", sessionId);
}
// List sessions in a subscription
for await (const sessionId of serviceBusClient.listMessageSessions("my-topic", "my-subscription")) {
console.log("Session ID:", sessionId);
}
// List only sessions whose stored session state was set or updated in the last seven days
const sessionStateUpdatedAfter = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000);
for await (const sessionId of serviceBusClient.listMessageSessions("my-session-queue", {
sessionStateUpdatedAfter,
})) {
console.log("Recently updated session ID:", sessionId);
}
Administración de recursos de un espacio de nombres de Service Bus
ServiceBusAdministrationClient permite administrar un espacio de nombres con operaciones CRUD en las entidades (colas, temas y suscripciones) y en las reglas de una suscripción.
- Admite la autenticación con una cadena de conexión de bus de servicio, así como con las credenciales de AAD de
@azure/identityforma similar a .ServiceBusClient
Nota: Service Bus aún no admite la configuración de reglas de CORS para espacios de nombres, por lo que ServiceBusAdministrationClient no funcionará en el explorador sin deshabilitar la seguridad web. Para obtener más información, consulte aquí.
import { ServiceBusAdministrationClient } from "@azure/service-bus";
const queueName = "my-session-queue";
// Get the connection string from the portal
// OR
// use the token credential overload, provide the host name of your Service Bus instance and the AAD credentials from the @azure/identity library
const serviceBusAdministrationClient = new ServiceBusAdministrationClient("<connectionString>");
// Similarly, you can create topics and subscriptions as well.
const createQueueResponse = await serviceBusAdministrationClient.createQueue(queueName);
console.log("Created queue with name - ", createQueueResponse.name);
const queueRuntimeProperties =
await serviceBusAdministrationClient.getQueueRuntimeProperties(queueName);
console.log(`Number of messages in the queue = ${queueRuntimeProperties.totalMessageCount}`);
// Topic runtime properties additionally report the total number of SQL and correlation filters
// across all of the topic's subscriptions. These counts are served by the 2024-05 service API
// version and later; on an older version they are `undefined`.
const topicName = "my-topic";
const subscriptionName = "my-subscription";
await serviceBusAdministrationClient.createTopic(topicName);
// A new subscription carries a default rule with a SQL TrueFilter. Adding a correlation rule
// gives the topic one of each, so the counts below aggregate across the subscription's rules.
await serviceBusAdministrationClient.createSubscription(topicName, subscriptionName);
await serviceBusAdministrationClient.createRule(
topicName,
subscriptionName,
"my-correlation-rule",
{ correlationId: "my-correlation-id" },
);
const topicRuntimeProperties =
await serviceBusAdministrationClient.getTopicRuntimeProperties(topicName);
console.log(`SQL filter count = ${topicRuntimeProperties.sqlFilterCount}`);
console.log(`Correlation filter count = ${topicRuntimeProperties.correlationFilterCount}`);
await serviceBusAdministrationClient.deleteTopic(topicName);
await serviceBusAdministrationClient.deleteQueue(queueName);
- Ejemplo de referencia - administrationClient.ts
Troubleshooting
Estos son algunos pasos iniciales para comenzar a diagnosticar problemas. Para obtener más información, consulte la Guía de solución de problemas de Service Bus.
Dependencias de AMQP
La biblioteca de Service Bus depende de la biblioteca rhea-promise para administrar conexiones, enviar y recibir mensajes a través del protocolo AMQP .
Logging
Puede establecer la siguiente variable de entorno para obtener los registros de depuración al usar esta biblioteca.
- Obtención de registros de depuración del SDK de Service Bus
export DEBUG=azure*
- Obtener registros de depuración del SDK de Service Bus y la biblioteca de nivel de protocolo.
export DEBUG=azure*,rhea*
- Si no está interesado en ver la transformación del mensaje (que consume mucho espacio en la consola/disco), puede establecer la variable de entorno de la
DEBUGsiguiente manera:
export DEBUG=azure*,rhea*,-rhea:raw,-rhea:message,-azure:core-amqp:datatransformer
- Si solo le interesan los errores, puede establecer la variable de entorno de la
DEBUGsiguiente manera:
export DEBUG=azure:service-bus:error,azure:core-amqp:error,rhea-promise:error,rhea:events,rhea:frames,rhea:io,rhea:flow
Registro en un archivo
- Establezca la variable de
DEBUGentorno como se muestra arriba - Ejecute el script de prueba de la siguiente manera:
- Las instrucciones de registro del script de prueba van a
out.logy las instrucciones de registro del sdk van adebug.log.node your-test-script.js > out.log 2>debug.log - Las instrucciones de registro del script de prueba y el SDK van al mismo archivo
out.logredireccionando stderr a stdout (&1) y, a continuación, redirigen stdout a un archivo:node your-test-script.js >out.log 2>&1 - Las instrucciones de registro del script de prueba y el sdk van al mismo archivo
out.log.node your-test-script.js &> out.log
Pasos siguientes
Eche un vistazo al directorio de ejemplos para obtener ejemplos detallados sobre cómo usar esta biblioteca para enviar y recibir mensajes a/desde colas de Service Bus, temas y suscripciones.
Contributing
Si quieres contribuir a esta biblioteca, por favor lee la guía contribución para aprender más sobre cómo construir y probar el código.
Azure SDK for JavaScript