From 4437675667d79840e44fda610ba39fa70428a95b Mon Sep 17 00:00:00 2001 From: Hannah Hunter Date: Thu, 12 May 2022 16:39:38 -0500 Subject: [PATCH 1/3] update to overview Signed-off-by: Hannah Hunter --- .../building-blocks/pubsub/pubsub-overview.md | 112 ++++++++++++------ 1 file changed, 75 insertions(+), 37 deletions(-) diff --git a/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-overview.md b/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-overview.md index 262e790b3d7..18d9302fe0f 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-overview.md +++ b/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-overview.md @@ -3,41 +3,56 @@ type: docs title: "Publish and subscribe overview" linkTitle: "Overview" weight: 1000 -description: "Overview of the Pub/Sub API building block" +description: "Overview of the Pub/sub API building block" --- -## Introduction +## Publish and subscribe pattern -The [publish/subscribe pattern](https://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern) allows microservices to communicate with each other using messages. The **producer or publisher** sends messages to a **topic** without knowledge of what application will receive them. This involves writing them to an input channel. Similarly, a **consumer or subscriber** subscribes to the topic and receive its messages without any knowledge of what service produced these messages. This involves receiving messages from an output channel. An intermediary message broker is responsible for copying each message from an input channel to an output channels for all subscribers interested in that message. This pattern is especially useful when you need to decouple microservices from one another. +The publish and subscribe pattern (Pub/sub) allows microservices to communicate with each other using messages. -The publish/subscribe API in Dapr provides an at-least-once guarantee and integrates with various message brokers and queuing systems. The specific implementation used by your service is pluggable and configured as a Dapr pub/sub component at runtime. This approach removes the dependency from your service and, as a result, makes your service more portable and flexible to changes. +- The producer, or **publisher**, writes messages to an input channel and sends them to a topic, unaware which application will receive them. +- The consumer, or **subscriber**, subscribes to the topic and receives messages from an output channel, unaware which service produced these messages. -The complete list of Dapr pub/sub components is [here]({{< ref supported-pubsub >}}). +An intermediary message broker copies each message from a publisher's input channel to an output channel for all subscribers interested in that message. This pattern is especially useful when you need to decouple microservices from one another.

-The Dapr pub/sub building block provides a platform-agnostic API to send and receive messages. Your services publish messages to a named topic and also subscribe to a topic to consume the messages. +## Pub/sub API in Dapr -The service makes a network call to a Dapr pub/sub building block, exposed as a sidecar. This building block then makes calls into a Dapr pub/sub component that encapsulates a specific message broker product. To receive topics, Dapr subscribes to the Dapr pub/sub component on behalf of your service and delivers the messages to an endpoint when they arrive. +The Pub/sub API in Dapr: +- Provides a platform-agnostic API to send and receive messages. +- Offers an at-least-once guarantee. +- Integrates with various message brokers and queuing systems. -The diagram below shows an example of a "shipping" service and an "email" service that have both subscribed to topics that are published by the "cart" service. Each service loads pub/sub component configuration files that point to the same pub/sub message bus component, for example Redis Streams, NATS Streaming, Azure Service Bus, or GCP Pub/Sub. +The specific implementation used by your service is pluggable and configured as a Dapr Pub/sub component at runtime. This approach removes the dependency from your service and, as a result, makes your service more portable and flexible to changes. + +When using the Pub/sub API in Dapr: + +1. Your service makes a network call to a Dapr Pub/sub building block, exposed as a sidecar. +1. The Pub/sub building block makes calls into a Dapr Pub/sub component that encapsulates a specific message broker product. +1. To receive topics, Dapr subscribes to the Dapr Pub/sub component on behalf of your service and delivers the messages to an endpoint when they arrive. + +In the diagram below, a "shipping" service and an "email" service have both subscribed to topics published by a "cart" service. Each service loads Pub/sub component configuration files that point to the same Pub/sub message bus component; for example: Redis Streams, NATS Streaming, Azure Service Bus, or GCP Pub/Sub.

-The diagram below has the same services, however this time showing the Dapr publish API that sends an "order" topic and order endpoints on the subscribing services that these topic messages are delivered posted to by Dapr. +In the diagram below, the Dapr API posts an "order" topic from the publishing "cart" service to "order" endpoints on the "shipping" and "email" subscribing services.

-## Features -The pub/sub building block provides several features to your application. +[View the complete list of Pub/sub components that Dapr supports]({{< ref supported-pubsub >}}). + +## Dapr Pub/sub API features + +The Pub/sub building block brings several features to your application. ### Cloud Events message format -To enable message routing and to provide additional context with each message, Dapr uses the [CloudEvents 1.0 specification](https://github.com/cloudevents/spec/tree/v1.0) as its message format. Any message sent by an application to a topic using Dapr is automatically "wrapped" in a Cloud Events envelope, using `Content-Type` header value for `datacontenttype` attribute. +To enable message routing and provide additional context with each message, Dapr uses the [CloudEvents 1.0 specification](https://github.com/cloudevents/spec/tree/v1.0) as its message format. Any message sent by an application to a topic using Dapr is automatically wrapped in a Cloud Events envelope, using [`Content-Type` header value]({{< ref "pubsub-overview.md#content-types" >}}) for `datacontenttype` attribute. Dapr implements the following Cloud Events fields: @@ -45,7 +60,7 @@ Dapr implements the following Cloud Events fields: * `source` * `specversion` * `type` -* `datacontenttype` (Optional) +* `datacontenttype` (optional) The following example shows an XML content in CloudEvent v1.0 serialized as JSON: @@ -62,59 +77,82 @@ The following example shows an XML content in CloudEvent v1.0 serialized as JSON } ``` -### Message subscription +#### Content types + +When publishing a message, it's important to specify the content type of the data being sent. +Unless specified, Dapr will assume `text/plain`. -Dapr applications can subscribe to published topics. Dapr allows two methods by which your applications can subscribe to topics: +For Dapr's HTTP API, the content type can be set in a `Content-Type` header. - - **Declarative**, where a subscription is defined in an external file, - - **Programmatic**, where a subscription is defined in the user code. +gRPC clients and SDKs have a dedicated content type parameter. + +### Message subscription - Both declarative and programmatic approaches support the same features. The declarative approach removes the Dapr dependency from your code and allows for existing applications to subscribe to topics, without having to change code. The programmatic approach implements the subscription in your code. +Dapr applications can subscribe to published topics via two methods that support the same features: declarative and programmatic. - For more information read [How-To: Publish a message and subscribe to a topic]({{< ref howto-publish-subscribe >}}). +| Subscription method | Description | +| ------------------- | ----------- | +| **Declarative** | Subscription is defined in an **external file**. The declarative approach removes the Dapr dependency from your code and allows for existing applications to subscribe to topics, without having to change code. | +| **Programmatic** | Subscription is defined in the **user code**. The programmatic approach implements the subscription in your code. | +For more information, read [about the subscriptions in the how-to]({{< ref howto-publish-subscribe.md >}}). ### Message delivery -In principle, Dapr considers message successfully delivered when the subscriber responds with a non-error response after processing the message. For more granular control, Dapr's publish/subscribe API also provides explicit statuses, defined in the response payload, which the subscriber can use to indicate the specific handling instructions to Dapr (e.g. `RETRY` or `DROP`). For more information on message routing read [Dapr publish/subscribe API documentation]({{< ref "pubsub_api.md#provide-routes-for-dapr-to-deliver-topic-events" >}}) +In principle, Dapr considers a message successfully delivered once the subscriber processes the message and responds with a non-error response. For more granular control, Dapr's Pub/sub API also provides explicit statuses, defined in the response payload, with which the subscriber indicates specific handling instructions to Dapr (for example, `RETRY` or `DROP`). + +For more information on message routing, read [Dapr Pub/sub API reference]({{< ref "pubsub_api.md#provide-routes-for-dapr-to-deliver-topic-events" >}}) ### At-least-once guarantee -Dapr guarantees "At-Least-Once" semantics for message delivery. That means that when an application publishes a message to a topic using the publish/subscribe API, Dapr ensures that this message will be delivered at least once to every subscriber. +Dapr guarantees at-least-once semantics for message delivery. When an application publishes a message to a topic using the Pub/sub API, Dapr ensures the message will be delivered *at least once* to every subscriber. ### Consumer groups and competing consumers pattern -The burden of dealing with concepts like consumer groups and multiple application instances using a single consumer group is all handled automatically by Dapr. When multiple instances of the same application (running same app-IDs) subscribe to a topic, Dapr delivers each message to *only one instance of **that** application*. This is commonly known as the competing consumers pattern and is illustrated in the diagram below. +Dapr automatically handles the burden of dealing with concepts like consumer groups and competing consumers pattern. The competing consumers pattern refers to multiple application instances using a single consumer group. When multiple instances of the same application (running same app IDs) subscribe to a topic, Dapr delivers each message to *only one instance of **that** application*. This concept is illustrated in the diagram below.

-Similarly, if two different applications (different app-IDs) subscribe to the same topic, Dapr deliver each message to *only one instance of **each** application*. +Similarly, if two different applications (with different app-IDs) subscribe to the same topic, Dapr delivers each message to *only one instance of **each** application*. ### Topic scoping -By default, all topics backing the Dapr pub/sub component (e.g. Kafka, Redis Stream, RabbitMQ) are available to every application configured with that component. To limit which application can publish or subscribe to topics, Dapr provides topic scoping. This enables you to say which topics an application is allowed to publish and which topics an application is allowed to subscribe to. For more information read [publish/subscribe topic scoping]({{< ref pubsub-scopes.md >}}). +By default, all topics backing the Dapr Pub/sub component are available to every application configured with that component. You can limit which application can publish or subscribe to topics with Dapr topic scoping. For more information, read: [Pub/sub topic scoping]({{< ref pubsub-scopes.md >}}). ### Message Time-to-Live (TTL) -Dapr can set a timeout message on a per message basis, meaning that if the message is not read from the pub/sub component, then the message is discarded. This is to prevent the build up of messages that are not read. A message that has been in the queue for longer than the configured TTL is said to be dead. For more information read [publish/subscribe message time-to-live]({{< ref pubsub-message-ttl.md >}}). -- Note: Message TTL can also be set for a given queue at the time of component creation. Look at the specific characteristic of the component that you are using. +Dapr can set a timeout message on a per-message basis, meaning that if the message is not read from the Pub/sub component, then the message is discarded. This timeout message prevents a build up of unread messages. If a message has been in the queue longer than the configured TTL, it is marked as dead. + +For more information, read [Pub/sub message TTL]({{< ref pubsub-message-ttl.md >}}). + +{{% alert title="Note" color="primary" %}} + You can also set message TTL for a given queue at component creation. Look at the specific characteristic of the component that you are using. + +{{% /alert %}} ### Communication with applications not using Dapr and CloudEvents -For scenarios where one application uses Dapr but another doesn't, CloudEvent wrapping can be disabled for a publisher or subscriber. This allows partial adoption of Dapr pubsub in applications that cannot adopt Dapr all at once. For more information read [how to use pubsub without CloudEvent]({{< ref pubsub-raw.md >}}). -### Publish/Subscribe API +If one of your applications uses Dapr while another doesn't, you can disable CloudEvent wrapping for a publisher or subscriber. This allows partial adoption of Dapr Pub/sub in applications that cannot adopt Dapr all at once. -The publish/subscribe API is located in the [API reference]({{< ref pubsub_api.md >}}). +For more information, read [how to use Pub/sub without CloudEvent]({{< ref pubsub-raw.md >}}). + +## Try it out + +Want to put the Dapr Pub/sub API to the test? Walk through the following quickstart and tutorials to see Pub/sub in action: + +| Quickstart/tutorial | Description | +| ------------------- | ----------- | +| [Pub/sub quickstart]({{< ref pubsub-quickstart.md >}}) | Send and receive messages using the publish and subscribe API. | +| [Pub/sub tutorial](https://github.com/dapr/quickstarts/tree/master/tutorials/pub-sub) | Demonstrates how to use Dapr to enable pub-sub applications. Uses Redis as a pub-sub component. | ## Next steps -* Follow these guides on: - * [How-To: Publish a message and subscribe to a topic]({{< ref howto-publish-subscribe.md >}}) - * [How-To: Configure Pub/Sub components with multiple namespaces]({{< ref pubsub-namespaces.md >}}) -* Try out the [Pub/Sub quickstart sample](https://github.com/dapr/quickstarts/tree/master/tutorials/pub-sub) +* Learn [how Dapr Pub/sub can work in your environment]({{< ref howto-publish-subscribe.md >}}). +* Follow the [How-To: Configure Pub/sub components with multiple namespaces]({{< ref pubsub-namespaces.md >}}) * Learn about [topic scoping]({{< ref pubsub-scopes.md >}}) -* Learn about [message time-to-live (TTL)]({{< ref pubsub-message-ttl.md >}}) -* Learn about [pubsub without CloudEvent]({{< ref pubsub-raw.md >}}) -* List of [pub/sub components]({{< ref supported-pubsub.md >}}) -* Read the [pub/sub API reference]({{< ref pubsub_api.md >}}) +* Learn about [message TTL]({{< ref pubsub-message-ttl.md >}}) +* Learn about [Pub/sub without CloudEvent]({{< ref pubsub-raw.md >}}) +* List of [Pub/sub components]({{< ref supported-pubsub.md >}}) +* Read the [Pub/sub API reference]({{< ref pubsub_api.md >}}) + From 7670e0f777f5f99a719c6d842a34baf88f52bf2e Mon Sep 17 00:00:00 2001 From: Hannah Hunter Date: Fri, 13 May 2022 10:37:36 -0500 Subject: [PATCH 2/3] updates per Mark Signed-off-by: Hannah Hunter --- .../building-blocks/pubsub/pubsub-overview.md | 103 +++++++++++------- 1 file changed, 65 insertions(+), 38 deletions(-) diff --git a/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-overview.md b/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-overview.md index 18d9302fe0f..04f2f2bfdfb 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-overview.md +++ b/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-overview.md @@ -3,12 +3,12 @@ type: docs title: "Publish and subscribe overview" linkTitle: "Overview" weight: 1000 -description: "Overview of the Pub/sub API building block" +description: "Overview of the Pub/Sub API building block" --- ## Publish and subscribe pattern -The publish and subscribe pattern (Pub/sub) allows microservices to communicate with each other using messages. +The publish and subscribe pattern (Pub/Sub) enables microservices to communicate with each other using messages for event-driven architectures. - The producer, or **publisher**, writes messages to an input channel and sends them to a topic, unaware which application will receive them. - The consumer, or **subscriber**, subscribes to the topic and receives messages from an output channel, unaware which service produced these messages. @@ -19,22 +19,22 @@ An intermediary message broker copies each message from a publisher's input chan

-## Pub/sub API in Dapr +## Pub/Sub API in Dapr -The Pub/sub API in Dapr: +The Pub/Sub API in Dapr: - Provides a platform-agnostic API to send and receive messages. -- Offers an at-least-once guarantee. +- Offers at-least-once message delivery guarantee. - Integrates with various message brokers and queuing systems. -The specific implementation used by your service is pluggable and configured as a Dapr Pub/sub component at runtime. This approach removes the dependency from your service and, as a result, makes your service more portable and flexible to changes. +The specific message broker used by your service is pluggable and configured as a Dapr Pub/Sub component at runtime. This removes the dependency from your service and makes your service more portable and flexible to changes. -When using the Pub/sub API in Dapr: +When using Pub/Sub in Dapr: -1. Your service makes a network call to a Dapr Pub/sub building block, exposed as a sidecar. -1. The Pub/sub building block makes calls into a Dapr Pub/sub component that encapsulates a specific message broker product. -1. To receive topics, Dapr subscribes to the Dapr Pub/sub component on behalf of your service and delivers the messages to an endpoint when they arrive. +1. Your service makes a network call to a Dapr Pub/Sub building block API. +1. The Pub/Sub building block makes calls into a Dapr Pub/Sub component that encapsulates a specific message broker. +1. To receive messages on a topic, Dapr subscribes to the Pub/Sub component on behalf of your service with a topic and delivers the messages to an endpoint on your service when they arrive. -In the diagram below, a "shipping" service and an "email" service have both subscribed to topics published by a "cart" service. Each service loads Pub/sub component configuration files that point to the same Pub/sub message bus component; for example: Redis Streams, NATS Streaming, Azure Service Bus, or GCP Pub/Sub. +In the diagram below, a "shipping" service and an "email" service have both subscribed to topics published by a "cart" service. Each service loads Pub/Sub component configuration files that point to the same Pub/Sub message bus component; for example: Redis Streams, NATS Streaming, Azure Service Bus, or GCP Pub/Sub.

@@ -44,25 +44,46 @@ In the diagram below, the Dapr API posts an "order" topic from the publishing "c

-[View the complete list of Pub/sub components that Dapr supports]({{< ref supported-pubsub >}}). +[View the complete list of Pub/Sub components that Dapr supports]({{< ref supported-pubsub >}}). -## Dapr Pub/sub API features +## Dapr Pub/Sub API features -The Pub/sub building block brings several features to your application. +The Pub/Sub building block brings several features to your application. -### Cloud Events message format +### Sending messages using Cloud Events -To enable message routing and provide additional context with each message, Dapr uses the [CloudEvents 1.0 specification](https://github.com/cloudevents/spec/tree/v1.0) as its message format. Any message sent by an application to a topic using Dapr is automatically wrapped in a Cloud Events envelope, using [`Content-Type` header value]({{< ref "pubsub-overview.md#content-types" >}}) for `datacontenttype` attribute. +Dapr Pub/Sub sends messages between services. To enable message routing and provide additional context with each message, Dapr uses the [CloudEvents 1.0 specification](https://github.com/cloudevents/spec/tree/v1.0) as its message format. Any message sent by an application to a topic using Dapr is automatically wrapped in a Cloud Events envelope, using [`Content-Type` header value]({{< ref "pubsub-overview.md#content-types" >}}) for `datacontenttype` attribute. -Dapr implements the following Cloud Events fields: +Dapr implements the following Cloud Events fields when creating a message topic. * `id` * `source` * `specversion` * `type` +* `traceparent` * `datacontenttype` (optional) -The following example shows an XML content in CloudEvent v1.0 serialized as JSON: +The following example demonstrates an `orders` topic message sent by Dapr that includes a W3C `traceid` unique to the message, the `data` and the fields for the CloudEvent where the data content is serialized as JSON. + +```json +{ + "topic": "orders", + "pubsubname": "order_pub_sub", + "traceid": "00-113ad9c4e42b27583ae98ba698d54255-e3743e35ff56f219-01", + "tracestate": "", + "data": { + "orderId": 1 + }, + "id": "5929aaac-a5e2-4ca1-859c-edfe73f11565", + "specversion": "1.0", + "datacontenttype": "application/json; charset=utf-8", + "source": "checkout", + "type": "com.dapr.event.sent", + "traceparent": "00-113ad9c4e42b27583ae98ba698d54255-e3743e35ff56f219-01" +} +``` + +As another example of a v1.0 CloudEvent, the following shows data as XML content in a CloudEvent message serialized as JSON: ```json { @@ -77,7 +98,7 @@ The following example shows an XML content in CloudEvent v1.0 serialized as JSON } ``` -#### Content types +#### Setting message content types When publishing a message, it's important to specify the content type of the data being sent. Unless specified, Dapr will assume `text/plain`. @@ -86,7 +107,11 @@ For Dapr's HTTP API, the content type can be set in a `Content-Type` header. gRPC clients and SDKs have a dedicated content type parameter. -### Message subscription +#### Message delivery + +In principle, Dapr considers a message successfully delivered once the subscriber processes the message and responds with a non-error response. For more granular control, Dapr's Pub/Sub API also provides explicit statuses, defined in the response payload, with which the subscriber indicates specific handling instructions to Dapr (for example, `RETRY` or `DROP`). + +### Receiving messages with topic subscriptions Dapr applications can subscribe to published topics via two methods that support the same features: declarative and programmatic. @@ -97,15 +122,17 @@ Dapr applications can subscribe to published topics via two methods that support For more information, read [about the subscriptions in the how-to]({{< ref howto-publish-subscribe.md >}}). -### Message delivery +### Message routing + +Dapr provides [content-based routing](https://www.enterpriseintegrationpatterns.com/ContentBasedRouter.html) pattern. [Pub/Sub routing]({{< ref howto-route-messages.md >}}) is an implementation of this pattern that allows developers to use expressions to route [CloudEvents](https://cloudevents.io) based on their contents to different URIs/paths and event handlers in your application. If no route matches, an optional default route is used. This is useful as your applications expands to support multiple event versions or special cases. -In principle, Dapr considers a message successfully delivered once the subscriber processes the message and responds with a non-error response. For more granular control, Dapr's Pub/sub API also provides explicit statuses, defined in the response payload, with which the subscriber indicates specific handling instructions to Dapr (for example, `RETRY` or `DROP`). +This feature is available to both the declarative and programmatic subscription approaches. -For more information on message routing, read [Dapr Pub/sub API reference]({{< ref "pubsub_api.md#provide-routes-for-dapr-to-deliver-topic-events" >}}) +For more information on message routing, read [Dapr Pub/Sub API reference]({{< ref "pubsub_api.md#provide-routes-for-dapr-to-deliver-topic-events" >}}) ### At-least-once guarantee -Dapr guarantees at-least-once semantics for message delivery. When an application publishes a message to a topic using the Pub/sub API, Dapr ensures the message will be delivered *at least once* to every subscriber. +Dapr guarantees at-least-once semantics for message delivery. When an application publishes a message to a topic using the Pub/Sub API, Dapr ensures the message is delivered *at least once* to every subscriber. ### Consumer groups and competing consumers pattern @@ -116,15 +143,15 @@ Dapr automatically handles the burden of dealing with concepts like consumer gro Similarly, if two different applications (with different app-IDs) subscribe to the same topic, Dapr delivers each message to *only one instance of **each** application*. -### Topic scoping +### Scoping topics for added security -By default, all topics backing the Dapr Pub/sub component are available to every application configured with that component. You can limit which application can publish or subscribe to topics with Dapr topic scoping. For more information, read: [Pub/sub topic scoping]({{< ref pubsub-scopes.md >}}). +By default, all topics backing the Dapr Pub/Sub component are available to every application configured with that component. You can limit which application can publish or subscribe to topics with Dapr topic scoping. For more information, read: [Pub/Sub topic scoping]({{< ref pubsub-scopes.md >}}). ### Message Time-to-Live (TTL) -Dapr can set a timeout message on a per-message basis, meaning that if the message is not read from the Pub/sub component, then the message is discarded. This timeout message prevents a build up of unread messages. If a message has been in the queue longer than the configured TTL, it is marked as dead. +Dapr can set a timeout message on a per-message basis, meaning that if the message is not read from the Pub/Sub component, then the message is discarded. This timeout message prevents a build up of unread messages. If a message has been in the queue longer than the configured TTL, it is marked as dead. -For more information, read [Pub/sub message TTL]({{< ref pubsub-message-ttl.md >}}). +For more information, read [Pub/Sub message TTL]({{< ref pubsub-message-ttl.md >}}). {{% alert title="Note" color="primary" %}} You can also set message TTL for a given queue at component creation. Look at the specific characteristic of the component that you are using. @@ -133,26 +160,26 @@ For more information, read [Pub/sub message TTL]({{< ref pubsub-message-ttl.md > ### Communication with applications not using Dapr and CloudEvents -If one of your applications uses Dapr while another doesn't, you can disable CloudEvent wrapping for a publisher or subscriber. This allows partial adoption of Dapr Pub/sub in applications that cannot adopt Dapr all at once. +If one of your applications uses Dapr while another doesn't, you can disable the CloudEvent wrapping for a publisher or subscriber. This allows partial adoption of Dapr Pub/Sub in applications that cannot adopt Dapr all at once. -For more information, read [how to use Pub/sub without CloudEvent]({{< ref pubsub-raw.md >}}). +For more information, read [how to use Pub/Sub without CloudEvents]({{< ref pubsub-raw.md >}}). ## Try it out -Want to put the Dapr Pub/sub API to the test? Walk through the following quickstart and tutorials to see Pub/sub in action: +Want to put the Dapr Pub/Sub API to the test? Walk through the following quickstart and tutorials to see Pub/Sub in action: | Quickstart/tutorial | Description | | ------------------- | ----------- | -| [Pub/sub quickstart]({{< ref pubsub-quickstart.md >}}) | Send and receive messages using the publish and subscribe API. | -| [Pub/sub tutorial](https://github.com/dapr/quickstarts/tree/master/tutorials/pub-sub) | Demonstrates how to use Dapr to enable pub-sub applications. Uses Redis as a pub-sub component. | +| [Pub/Sub quickstart]({{< ref pubsub-quickstart.md >}}) | Send and receive messages using the publish and subscribe API. | +| [Pub/Sub tutorial](https://github.com/dapr/quickstarts/tree/master/tutorials/pub-sub) | Demonstrates how to use Dapr to enable pub-sub applications. Uses Redis as a pub-sub component. | ## Next steps -* Learn [how Dapr Pub/sub can work in your environment]({{< ref howto-publish-subscribe.md >}}). -* Follow the [How-To: Configure Pub/sub components with multiple namespaces]({{< ref pubsub-namespaces.md >}}) +* Learn [how Dapr Pub/Sub can work in your environment]({{< ref howto-publish-subscribe.md >}}). +* Follow the [How-To: Configure Pub/Sub components with multiple namespaces]({{< ref pubsub-namespaces.md >}}) * Learn about [topic scoping]({{< ref pubsub-scopes.md >}}) * Learn about [message TTL]({{< ref pubsub-message-ttl.md >}}) -* Learn about [Pub/sub without CloudEvent]({{< ref pubsub-raw.md >}}) -* List of [Pub/sub components]({{< ref supported-pubsub.md >}}) -* Read the [Pub/sub API reference]({{< ref pubsub_api.md >}}) +* Learn about [Pub/Sub without CloudEvent]({{< ref pubsub-raw.md >}}) +* List of [Pub/Sub components]({{< ref supported-pubsub.md >}}) +* Read the [Pub/Sub API reference]({{< ref pubsub_api.md >}}) From 1dc367b0af5cd1fd2468a9debcbb55776f16d58e Mon Sep 17 00:00:00 2001 From: Hannah Hunter Date: Wed, 18 May 2022 16:55:27 -0500 Subject: [PATCH 3/3] change wording in next steps Signed-off-by: Hannah Hunter --- .../building-blocks/pubsub/pubsub-overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-overview.md b/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-overview.md index 04f2f2bfdfb..859c0f16dd7 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-overview.md +++ b/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-overview.md @@ -175,7 +175,7 @@ Want to put the Dapr Pub/Sub API to the test? Walk through the following quickst ## Next steps -* Learn [how Dapr Pub/Sub can work in your environment]({{< ref howto-publish-subscribe.md >}}). +* Learn [how to use Pub/Sub]({{< ref howto-publish-subscribe.md >}}). * Follow the [How-To: Configure Pub/Sub components with multiple namespaces]({{< ref pubsub-namespaces.md >}}) * Learn about [topic scoping]({{< ref pubsub-scopes.md >}}) * Learn about [message TTL]({{< ref pubsub-message-ttl.md >}})