From 8f6dedeec899741619490cb1be03fa8350a9978a Mon Sep 17 00:00:00 2001 From: Hannah Hunter Date: Tue, 3 May 2022 21:16:09 -0500 Subject: [PATCH 1/8] overview; parse out howto-publish-subscribe Signed-off-by: Hannah Hunter --- .../pubsub/custom-cloudevent.md | 53 ++ .../pubsub/howto-publish-subscribe.md | 686 ------------------ .../building-blocks/pubsub/pubsub-overview.md | 107 ++- .../building-blocks/pubsub/pubsub-raw.md | 2 +- .../pubsub/subscription-methods.md | 353 +++++++++ 5 files changed, 477 insertions(+), 724 deletions(-) create mode 100644 daprdocs/content/en/developing-applications/building-blocks/pubsub/custom-cloudevent.md create mode 100644 daprdocs/content/en/developing-applications/building-blocks/pubsub/subscription-methods.md diff --git a/daprdocs/content/en/developing-applications/building-blocks/pubsub/custom-cloudevent.md b/daprdocs/content/en/developing-applications/building-blocks/pubsub/custom-cloudevent.md new file mode 100644 index 00000000000..d73bf963355 --- /dev/null +++ b/daprdocs/content/en/developing-applications/building-blocks/pubsub/custom-cloudevent.md @@ -0,0 +1,53 @@ +--- +type: docs +title: "Use a custom CloudEvent" +linkTitle: "Custom CloudEvent" +weight: 8000 +description: "Take the default Dapr CloudEvent wrapping a step further with your own custom CloudEvent" +--- + +## Sending a custom CloudEvent + +Dapr automatically takes the data sent on the publish request and [wraps it in a CloudEvent 1.0 envelope]({{< ref "pubsub-overview.md#cloud-events-message-format" >}}). If you want to use your own custom CloudEvent, make sure to specify the [content type]({{< ref "pubsub-overview.md#content-types" >}}) as `application/cloudevents+json`. + +### Example + +{{< tabs "Dapr CLI" "HTTP API (Bash)" "HTTP API (PowerShell)">}} + +{{% codetab %}} + +Publish a custom CloudEvent to the `orders` topic: + +```bash +dapr publish --publish-app-id orderprocessing --pubsub order-pub-sub --topic orders --data '{"specversion" : "1.0", "type" : "com.dapr.cloudevent.sent", "source" : "testcloudeventspubsub", "subject" : "Cloud Events Test", "id" : "someCloudEventId", "time" : "2021-08-02T09:00:00Z", "datacontenttype" : "application/cloudevents+json", "data" : {"orderId": "100"}}' +``` + +{{% /codetab %}} + +{{% codetab %}} + +Publish a custom CloudEvent to the `orders` topic: + +```bash +curl -X POST http://localhost:3601/v1.0/publish/order-pub-sub/orders -H "Content-Type: application/cloudevents+json" -d '{"specversion" : "1.0", "type" : "com.dapr.cloudevent.sent", "source" : "testcloudeventspubsub", "subject" : "Cloud Events Test", "id" : "someCloudEventId", "time" : "2021-08-02T09:00:00Z", "datacontenttype" : "application/cloudevents+json", "data" : {"orderId": "100"}}' +``` + +{{% /codetab %}} + +{{% codetab %}} + +Publish a custom CloudEvent to the `orders` topic: + +```powershell +Invoke-RestMethod -Method Post -ContentType 'application/cloudevents+json' -Body '{"specversion" : "1.0", "type" : "com.dapr.cloudevent.sent", "source" : "testcloudeventspubsub", "subject" : "Cloud Events Test", "id" : "someCloudEventId", "time" : "2021-08-02T09:00:00Z", "datacontenttype" : "application/cloudevents+json", "data" : {"orderId": "100"}}' -Uri 'http://localhost:3601/v1.0/publish/order-pub-sub/orders' +``` + +{{% /codetab %}} + +{{< /tabs >}} + +## Next steps + +- Try out the [Pub/sub Quickstart]({{< ref pubsub-quickstart.md >}}) +- List of [Pub/sub components]({{< ref setup-pubsub >}}) +- Read the [API reference]({{< ref pubsub_api.md >}}) diff --git a/daprdocs/content/en/developing-applications/building-blocks/pubsub/howto-publish-subscribe.md b/daprdocs/content/en/developing-applications/building-blocks/pubsub/howto-publish-subscribe.md index 5393fd7efce..441eea076d5 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/pubsub/howto-publish-subscribe.md +++ b/daprdocs/content/en/developing-applications/building-blocks/pubsub/howto-publish-subscribe.md @@ -5,696 +5,10 @@ linkTitle: "How-To: Publish & subscribe" weight: 2000 description: "Learn how to send messages to a topic with one service and subscribe to that topic in another service" --- - -## Introduction - -Pub/Sub is a common pattern in a distributed system with many services that want to utilize decoupled, asynchronous messaging. -Using Pub/Sub, you can enable scenarios where event consumers are decoupled from event producers. - -Dapr provides an extensible Pub/Sub system with At-Least-Once guarantees, allowing developers to publish and subscribe to topics. -Dapr provides components for pub/sub, that enable operators to use their preferred infrastructure, for example Redis Streams, Kafka, etc. - -## 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`. When using 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. - -## Example: - -The below code example loosely describes an application that processes orders. In the example, there are two services - an order processing service and a checkout service. Both services have Dapr sidecars. The order processing service uses Dapr to publish a message to RabbitMQ and the checkout service subscribes to the topic in the message queue. - -Diagram showing state management of example service - -## Step 1: Setup the Pub/Sub component -The following example creates applications to publish and subscribe to a topic called `orders`. - -The first step is to setup the Pub/Sub component: - -{{< tabs "Self-Hosted (CLI)" Kubernetes >}} - -{{% codetab %}} -The pubsub.yaml is created by default on your local machine when running `dapr init`. Verify by opening your components file under `%UserProfile%\.dapr\components\pubsub.yaml` on Windows or `~/.dapr/components/pubsub.yaml` on Linux/MacOS. - -In this example, RabbitMQ is used for publish and subscribe. Replace `pubsub.yaml` file contents with the below contents. - -```yaml -apiVersion: dapr.io/v1alpha1 -kind: Component -metadata: - name: order-pub-sub -spec: - type: pubsub.rabbitmq - version: v1 - metadata: - - name: host - value: "amqp://localhost:5672" - - name: durable - value: "false" - - name: deletedWhenUnused - value: "false" - - name: autoAck - value: "false" - - name: reconnectWait - value: "0" - - name: concurrency - value: parallel -scopes: - - orderprocessing - - checkout -``` - -You can override this file with another Redis instance or another [pubsub component]({{< ref setup-pubsub >}}) by creating a `components` directory containing the file and using the flag `--components-path` with the `dapr run` CLI command. -{{% /codetab %}} - -{{% codetab %}} -To deploy this into a Kubernetes cluster, fill in the `metadata` connection details of your [desired pubsub component]({{< ref setup-pubsub >}}) in the yaml below, save as `pubsub.yaml`, and run `kubectl apply -f pubsub.yaml`. - -```yaml -apiVersion: dapr.io/v1alpha1 -kind: Component -metadata: - name: order-pub-sub - namespace: default -spec: - type: pubsub.rabbitmq - version: v1 - metadata: - - name: host - value: "amqp://localhost:5672" - - name: durable - value: "false" - - name: deletedWhenUnused - value: "false" - - name: autoAck - value: "false" - - name: reconnectWait - value: "0" - - name: concurrency - value: parallel -scopes: - - orderprocessing - - checkout -``` -{{% /codetab %}} - -{{< /tabs >}} - - -## Step 2: Subscribe to topics - -Dapr allows two methods by which you can subscribe to topics: - -- **Declaratively**, where subscriptions are defined in an external file. -- **Programmatically**, where subscriptions are defined in user code. - -{{% alert title="Note" color="primary" %}} - Both declarative and programmatic approaches support the same features. The declarative approach removes the Dapr dependency from your code and allows, for example, existing applications to subscribe to topics, without having to change code. The programmatic approach implements the subscription in your code. - -{{% /alert %}} - -### Declarative subscriptions - -You can subscribe to a topic using the following Custom Resources Definition (CRD). Create a file named `subscription.yaml` and paste the following: - -```yaml -apiVersion: dapr.io/v1alpha1 -kind: Subscription -metadata: - name: order-pub-sub -spec: - topic: orders - route: /checkout - pubsubname: order-pub-sub -scopes: -- orderprocessing -- checkout -``` - -The example above shows an event subscription to topic `orders`, for the pubsub component `order-pub-sub`. -- The `route` field tells Dapr to send all topic messages to the `/checkout` endpoint in the app. -- The `scopes` field enables this subscription for apps with IDs `orderprocessing` and `checkout`. - -Set the component with: - -Place the CRD in your `./components` directory. When Dapr starts up, it loads subscriptions along with components. - -Note: By default, Dapr loads components from `$HOME/.dapr/components` on MacOS/Linux and `%USERPROFILE%\.dapr\components` on Windows. - -You can also override the default directory by pointing the Dapr CLI to a components path: - -{{< tabs Dotnet Java Python Go Javascript Kubernetes>}} - -{{% codetab %}} - -```bash -dapr run --app-id myapp --components-path ./myComponents -- dotnet run -``` - -{{% /codetab %}} - -{{% codetab %}} - -```bash -dapr run --app-id myapp --components-path ./myComponents -- mvn spring-boot:run -``` - -{{% /codetab %}} - -{{% codetab %}} - -```bash -dapr run --app-id myapp --components-path ./myComponents -- python3 app.py -``` - -{{% /codetab %}} - -{{% codetab %}} - -```bash -dapr run --app-id myapp --components-path ./myComponents -- go run app.go -``` - -{{% /codetab %}} - -{{% codetab %}} - -```bash -dapr run --app-id myapp --components-path ./myComponents -- npm start -``` - -{{% /codetab %}} - -{{% codetab %}} -In Kubernetes, save the CRD to a file and apply it to the cluster: -```bash -kubectl apply -f subscription.yaml -``` -{{% /codetab %}} - -{{< /tabs >}} - -Below are code examples that leverage Dapr SDKs to subscribe to a topic. - -{{< tabs Dotnet Java Python Go Javascript>}} - -{{% codetab %}} - -```csharp -//dependencies -using System.Collections.Generic; -using System.Threading.Tasks; -using System; -using Microsoft.AspNetCore.Mvc; -using Dapr; -using Dapr.Client; - -//code -namespace CheckoutService.controller -{ - [ApiController] - public class CheckoutServiceController : Controller - { - //Subscribe to a topic - [Topic("order-pub-sub", "orders")] - [HttpPost("checkout")] - public void getCheckout([FromBody] int orderId) - { - Console.WriteLine("Subscriber received : " + orderId); - } - } -} -``` - -Navigate to the directory containing the above code, then run the following command to launch a Dapr sidecar and run the application: - -```bash -dapr run --app-id checkout --app-port 6002 --dapr-http-port 3602 --dapr-grpc-port 60002 --app-ssl dotnet run -``` - -{{% /codetab %}} - -{{% codetab %}} - -```java -//dependencies -import io.dapr.Topic; -import io.dapr.client.domain.CloudEvent; -import org.springframework.web.bind.annotation.*; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import reactor.core.publisher.Mono; - -//code -@RestController -public class CheckoutServiceController { - - private static final Logger log = LoggerFactory.getLogger(CheckoutServiceController.class); - //Subscribe to a topic - @Topic(name = "orders", pubsubName = "order-pub-sub") - @PostMapping(path = "/checkout") - public Mono getCheckout(@RequestBody(required = false) CloudEvent cloudEvent) { - return Mono.fromRunnable(() -> { - try { - log.info("Subscriber received: " + cloudEvent.getData()); - } catch (Exception e) { - throw new RuntimeException(e); - } - }); - } -} -``` - -Navigate to the directory containing the above code, then run the following command to launch a Dapr sidecar and run the application: - -```bash -dapr run --app-id checkout --app-port 6002 --dapr-http-port 3602 --dapr-grpc-port 60002 mvn spring-boot:run -``` - -{{% /codetab %}} - -{{% codetab %}} - -```python -#dependencies -from cloudevents.sdk.event import v1 -from dapr.ext.grpc import App -import logging -import json - -#code -app = App() -logging.basicConfig(level = logging.INFO) -#Subscribe to a topic -@app.subscribe(pubsub_name='order-pub-sub', topic='orders') -def mytopic(event: v1.Event) -> None: - data = json.loads(event.Data()) - logging.info('Subscriber received: ' + str(data)) - -app.run(6002) -``` - -Navigate to the directory containing the above code, then run the following command to launch a Dapr sidecar and run the application: - -```bash -dapr run --app-id checkout --app-port 6002 --dapr-http-port 3602 --app-protocol grpc -- python3 CheckoutService.py -``` - -{{% /codetab %}} - -{{% codetab %}} - -```go -//dependencies -import ( - "log" - "net/http" - "context" - - "github.com/dapr/go-sdk/service/common" - daprd "github.com/dapr/go-sdk/service/http" -) - -//code -var sub = &common.Subscription{ - PubsubName: "order-pub-sub", - Topic: "orders", - Route: "/checkout", -} - -func main() { - s := daprd.NewService(":6002") - //Subscribe to a topic - if err := s.AddTopicEventHandler(sub, eventHandler); err != nil { - log.Fatalf("error adding topic subscription: %v", err) - } - if err := s.Start(); err != nil && err != http.ErrServerClosed { - log.Fatalf("error listenning: %v", err) - } -} - -func eventHandler(ctx context.Context, e *common.TopicEvent) (retry bool, err error) { - log.Printf("Subscriber received: %s", e.Data) - return false, nil -} -``` - -Navigate to the directory containing the above code, then run the following command to launch a Dapr sidecar and run the application: - -```bash -dapr run --app-id checkout --app-port 6002 --dapr-http-port 3602 --dapr-grpc-port 60002 go run CheckoutService.go -``` - -{{% /codetab %}} - -{{% codetab %}} - -```javascript -//dependencies -import { DaprServer, CommunicationProtocolEnum } from 'dapr-client'; - -//code -const daprHost = "127.0.0.1"; -const serverHost = "127.0.0.1"; -const serverPort = "6002"; - -start().catch((e) => { - console.error(e); - process.exit(1); -}); - -async function start(orderId) { - const server = new DaprServer( - serverHost, - serverPort, - daprHost, - process.env.DAPR_HTTP_PORT, - CommunicationProtocolEnum.HTTP - ); - //Subscribe to a topic - await server.pubsub.subscribe("order-pub-sub", "orders", async (orderId) => { - console.log(`Subscriber received: ${JSON.stringify(orderId)}`) - }); - await server.startServer(); -} -``` - -Navigate to the directory containing the above code, then run the following command to launch a Dapr sidecar and run the application: - -```bash -dapr run --app-id checkout --app-port 6002 --dapr-http-port 3602 --dapr-grpc-port 60002 npm start -``` - -{{% /codetab %}} - -{{< /tabs >}} - -The `/checkout` endpoint matches the `route` defined in the subscriptions and this is where Dapr will send all topic messages to. - -## Step 3: Publish a topic - -Start an instance of Dapr with an app-id called `orderprocessing`: - -```bash -dapr run --app-id orderprocessing --dapr-http-port 3601 -``` -{{< tabs "Dapr CLI" "HTTP API (Bash)" "HTTP API (PowerShell)">}} - -{{% codetab %}} - -Then publish a message to the `orders` topic: - -```bash -dapr publish --publish-app-id orderprocessing --pubsub order-pub-sub --topic orders --data '{"orderId": "100"}' -``` -{{% /codetab %}} - -{{% codetab %}} -Then publish a message to the `orders` topic: -```bash -curl -X POST http://localhost:3601/v1.0/publish/order-pub-sub/orders -H "Content-Type: application/json" -d '{"orderId": "100"}' -``` -{{% /codetab %}} - -{{% codetab %}} -Then publish a message to the `orders` topic: -```powershell -Invoke-RestMethod -Method Post -ContentType 'application/json' -Body '{"orderId": "100"}' -Uri 'http://localhost:3601/v1.0/publish/order-pub-sub/orders' -``` -{{% /codetab %}} - -{{< /tabs >}} - -Dapr automatically wraps the user payload in a Cloud Events v1.0 compliant envelope, using `Content-Type` header value for `datacontenttype` attribute. - -Below are code examples that leverage Dapr SDKs to publish a topic. - -{{< tabs Dotnet Java Python Go Javascript>}} - -{{% codetab %}} - -```csharp -//dependencies -using System; -using System.Collections.Generic; -using System.Net.Http; -using System.Net.Http.Headers; -using System.Threading.Tasks; -using Dapr.Client; -using Microsoft.AspNetCore.Mvc; -using System.Threading; - -//code -namespace EventService -{ - class Program - { - static async Task Main(string[] args) - { - string PUBSUB_NAME = "order-pub-sub"; - string TOPIC_NAME = "orders"; - while(true) { - System.Threading.Thread.Sleep(5000); - Random random = new Random(); - int orderId = random.Next(1,1000); - CancellationTokenSource source = new CancellationTokenSource(); - CancellationToken cancellationToken = source.Token; - using var client = new DaprClientBuilder().Build(); - //Using Dapr SDK to publish a topic - await client.PublishEventAsync(PUBSUB_NAME, TOPIC_NAME, orderId, cancellationToken); - Console.WriteLine("Published data: " + orderId); - } - } - } -} -``` - -Navigate to the directory containing the above code, then run the following command to launch a Dapr sidecar and run the application: - -```bash -dapr run --app-id orderprocessing --app-port 6001 --dapr-http-port 3601 --dapr-grpc-port 60001 --app-ssl dotnet run -``` - -{{% /codetab %}} - -{{% codetab %}} - -```java -//dependencies -import io.dapr.client.DaprClient; -import io.dapr.client.DaprClientBuilder; -import io.dapr.client.domain.Metadata; -import static java.util.Collections.singletonMap; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import java.util.Random; -import java.util.concurrent.TimeUnit; - -//code -@SpringBootApplication -public class OrderProcessingServiceApplication { - - private static final Logger log = LoggerFactory.getLogger(OrderProcessingServiceApplication.class); - - public static void main(String[] args) throws InterruptedException{ - String MESSAGE_TTL_IN_SECONDS = "1000"; - String TOPIC_NAME = "orders"; - String PUBSUB_NAME = "order-pub-sub"; - - while(true) { - TimeUnit.MILLISECONDS.sleep(5000); - Random random = new Random(); - int orderId = random.nextInt(1000-1) + 1; - DaprClient client = new DaprClientBuilder().build(); - //Using Dapr SDK to publish a topic - client.publishEvent( - PUBSUB_NAME, - TOPIC_NAME, - orderId, - singletonMap(Metadata.TTL_IN_SECONDS, MESSAGE_TTL_IN_SECONDS)).block(); - log.info("Published data:" + orderId); - } - } -} -``` - -Navigate to the directory containing the above code, then run the following command to launch a Dapr sidecar and run the application: - -```bash -dapr run --app-id orderprocessing --app-port 6001 --dapr-http-port 3601 --dapr-grpc-port 60001 mvn spring-boot:run -``` - -{{% /codetab %}} - -{{% codetab %}} - -```python -#dependencies -import random -from time import sleep -import requests -import logging -import json -from dapr.clients import DaprClient - -#code -logging.basicConfig(level = logging.INFO) -while True: - sleep(random.randrange(50, 5000) / 1000) - orderId = random.randint(1, 1000) - PUBSUB_NAME = 'order-pub-sub' - TOPIC_NAME = 'orders' - with DaprClient() as client: - #Using Dapr SDK to publish a topic - result = client.publish_event( - pubsub_name=PUBSUB_NAME, - topic_name=TOPIC_NAME, - data=json.dumps(orderId), - data_content_type='application/json', - ) - logging.info('Published data: ' + str(orderId)) -``` - -Navigate to the directory containing the above code, then run the following command to launch a Dapr sidecar and run the application: - -```bash -dapr run --app-id orderprocessing --app-port 6001 --dapr-http-port 3601 --app-protocol grpc python3 OrderProcessingService.py -``` - -{{% /codetab %}} - -{{% codetab %}} - -```go -//dependencies -import ( - "context" - "log" - "math/rand" - "time" - "strconv" - dapr "github.com/dapr/go-sdk/client" -) - -//code -var ( - PUBSUB_NAME = "order-pub-sub" - TOPIC_NAME = "orders" -) - -func main() { - for i := 0; i < 10; i++ { - time.Sleep(5000) - orderId := rand.Intn(1000-1) + 1 - client, err := dapr.NewClient() - if err != nil { - panic(err) - } - defer client.Close() - ctx := context.Background() - //Using Dapr SDK to publish a topic - if err := client.PublishEvent(ctx, PUBSUB_NAME, TOPIC_NAME, []byte(strconv.Itoa(orderId))); - err != nil { - panic(err) - } - - log.Println("Published data: " + strconv.Itoa(orderId)) - } -} -``` - -Navigate to the directory containing the above code, then run the following command to launch a Dapr sidecar and run the application: - -```bash -dapr run --app-id orderprocessing --app-port 6001 --dapr-http-port 3601 --dapr-grpc-port 60001 go run OrderProcessingService.go -``` - -{{% /codetab %}} - -{{% codetab %}} - -```javascript -//dependencies -import { DaprServer, DaprClient, CommunicationProtocolEnum } from 'dapr-client'; - -const daprHost = "127.0.0.1"; - -var main = function() { - for(var i=0;i<10;i++) { - sleep(5000); - var orderId = Math.floor(Math.random() * (1000 - 1) + 1); - start(orderId).catch((e) => { - console.error(e); - process.exit(1); - }); - } -} - -async function start(orderId) { - const PUBSUB_NAME = "order-pub-sub" - const TOPIC_NAME = "orders" - const client = new DaprClient(daprHost, process.env.DAPR_HTTP_PORT, CommunicationProtocolEnum.HTTP); - console.log("Published data:" + orderId) - //Using Dapr SDK to publish a topic - await client.pubsub.publish(PUBSUB_NAME, TOPIC_NAME, orderId); -} - -function sleep(ms) { - return new Promise(resolve => setTimeout(resolve, ms)); -} - -main(); -``` - -Navigate to the directory containing the above code, then run the following command to launch a Dapr sidecar and run the application: - -```bash -dapr run --app-id orderprocessing --app-port 6001 --dapr-http-port 3601 --dapr-grpc-port 60001 npm start -``` - -{{% /codetab %}} - -{{< /tabs >}} - ## Step 4: ACK-ing a message In order to tell Dapr that a message was processed successfully, return a `200 OK` response. If Dapr receives any other return status code than `200`, or if your app crashes, Dapr will attempt to redeliver the message following at-least-once semantics. -## Sending a custom CloudEvent - -Dapr automatically takes the data sent on the publish request and wraps it in a CloudEvent 1.0 envelope. -If you want to use your own custom CloudEvent, make sure to specify the content type as `application/cloudevents+json`. - -Read about content types [here](#content-types), and about the [Cloud Events message format]({{< ref "pubsub-overview.md#cloud-events-message-format" >}}). - -#### Example - -{{< tabs "Dapr CLI" "HTTP API (Bash)" "HTTP API (PowerShell)">}} - -{{% codetab %}} -Publish a custom CloudEvent to the `orders` topic: -```bash -dapr publish --publish-app-id orderprocessing --pubsub order-pub-sub --topic orders --data '{"specversion" : "1.0", "type" : "com.dapr.cloudevent.sent", "source" : "testcloudeventspubsub", "subject" : "Cloud Events Test", "id" : "someCloudEventId", "time" : "2021-08-02T09:00:00Z", "datacontenttype" : "application/cloudevents+json", "data" : {"orderId": "100"}}' -``` -{{% /codetab %}} - -{{% codetab %}} -Publish a custom CloudEvent to the `orders` topic: -```bash -curl -X POST http://localhost:3601/v1.0/publish/order-pub-sub/orders -H "Content-Type: application/cloudevents+json" -d '{"specversion" : "1.0", "type" : "com.dapr.cloudevent.sent", "source" : "testcloudeventspubsub", "subject" : "Cloud Events Test", "id" : "someCloudEventId", "time" : "2021-08-02T09:00:00Z", "datacontenttype" : "application/cloudevents+json", "data" : {"orderId": "100"}}' -``` -{{% /codetab %}} - -{{% codetab %}} -Publish a custom CloudEvent to the `orders` topic: -```powershell -Invoke-RestMethod -Method Post -ContentType 'application/cloudevents+json' -Body '{"specversion" : "1.0", "type" : "com.dapr.cloudevent.sent", "source" : "testcloudeventspubsub", "subject" : "Cloud Events Test", "id" : "someCloudEventId", "time" : "2021-08-02T09:00:00Z", "datacontenttype" : "application/cloudevents+json", "data" : {"orderId": "100"}}' -Uri 'http://localhost:3601/v1.0/publish/order-pub-sub/orders' -``` -{{% /codetab %}} - -{{< /tabs >}} ## Next steps 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..740121a0fdb 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,77 @@ The following example shows an XML content in CloudEvent v1.0 serialized as JSON } ``` -### Message subscription +#### Content types -Dapr applications can subscribe to published topics. Dapr allows two methods by which your applications can subscribe to topics: +When publishing a message, it's important to specify the content type of the data being sent. +Unless specified, Dapr will assume `text/plain`. - - **Declarative**, where a subscription is defined in an external file, - - **Programmatic**, where a subscription is defined in the user code. +For Dapr's HTTP API, the content type can be set in a `Content-Type` header. - 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. +gRPC clients and SDKs have a dedicated content type parameter. + +### Message subscription - For more information read [How-To: Publish a message and subscribe to a topic]({{< ref howto-publish-subscribe >}}). +Dapr applications can subscribe to published topics via two methods that support the same features: declarative and programmatic. +| 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: [Declarative vs. Programmatic]({{< ref subscription-methods >}}). ### 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 >}}). + +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. + +For more information, read [how to use Pub/sub without CloudEvent]({{< ref pubsub-raw.md >}}). ### Publish/Subscribe API -The publish/subscribe API is located in the [API reference]({{< ref pubsub_api.md >}}). +The publish/subscribe API is located in the [API reference document]({{< ref pubsub_api.md >}}). ## 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 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 >}}) +* Try out the [Pub/sub Quickstart]({{< ref pubsub-quickstart.md >}}) +* Follow the [How-To: Configure Pub/sub components with multiple namespaces]({{< ref pubsub-namespaces.md >}}) +* Learn more about [declarative and programmatic subscription methods]({{< ref subscription-methods >}}). +- 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 >}}) diff --git a/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-raw.md b/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-raw.md index f4d542f2daf..c75288366e7 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-raw.md +++ b/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-raw.md @@ -167,6 +167,6 @@ scopes: ## Next steps -- Learn more about [how to publish and subscribe]({{< ref howto-publish-subscribe.md >}}) +- Learn more about [publishing and subscribing messages]({{< ref pubsub-overview.md >}}) - List of [pub/sub components]({{< ref supported-pubsub >}}) - Read the [API reference]({{< ref pubsub_api.md >}}) diff --git a/daprdocs/content/en/developing-applications/building-blocks/pubsub/subscription-methods.md b/daprdocs/content/en/developing-applications/building-blocks/pubsub/subscription-methods.md new file mode 100644 index 00000000000..b496b1f5d0b --- /dev/null +++ b/daprdocs/content/en/developing-applications/building-blocks/pubsub/subscription-methods.md @@ -0,0 +1,353 @@ +--- +type: docs +title: "Declarative vs. programmatic subscription methods" +linkTitle: "Declarative vs. programmatic" +weight: 3000 +description: "Learn more about the two methods by which Dapr allows you to subscribe to topics." +--- + +## Pub/sub API subscription methods + +Dapr applications can subscribe to published topics via two methods that support the same features: declarative and programmatic. + +| Subscription method | Description | +| ------------------- | ----------- | +| [**Declarative**]({{< ref "subscription-methods.md#declarative-subscriptions" >}}) | 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**]({{< ref "subscription-methods.md#programmatic-subscriptions" >}}) | Subscription is defined in the **user code**. The programmatic approach implements the subscription in your code. | + +The examples below demonstrate Pub/sub messaging between a `checkout` app and an `orderprocessing` app via the `orders` topic. The examples demonstrate the same Dapr Pub/sub component used first declaratively, then programmatically. + +### Declarative subscriptions + +You can subscribe declaratively to a topic using an external component file. This example uses a YAML component file named `subscription.yaml`: + +```yaml +apiVersion: dapr.io/v1alpha1 +kind: Subscription +metadata: + name: order_pub_sub +spec: + topic: orders + route: /checkout + pubsubname: order_pub_sub +scopes: +- orderprocessing +- checkout +``` + +Notice, the Pub/sub component `order_pub_sub` subscribes to topic `orders`. +- The `route` field tells Dapr to send all topic messages to the `/checkout` endpoint in the app. +- The `scopes` field enables this subscription for apps with IDs `orderprocessing` and `checkout`. + +When running Dapr, call out the YAML component file path to point Dapr to the component. + +{{< tabs ".NET" Java Python JavaScript Go Kubernetes>}} + +{{% codetab %}} + +```bash +dapr run --app-id myapp --components-path ./myComponents -- dotnet run +``` + +{{% /codetab %}} + +{{% codetab %}} + +```bash +dapr run --app-id myapp --components-path ./myComponents -- mvn spring-boot:run +``` + +{{% /codetab %}} + +{{% codetab %}} + +```bash +dapr run --app-id myapp --components-path ./myComponents -- python3 app.py +``` + +{{% /codetab %}} + +{{% codetab %}} + +```bash +dapr run --app-id myapp --components-path ./myComponents -- npm start +``` + +{{% /codetab %}} + +{{% codetab %}} + +```bash +dapr run --app-id myapp --components-path ./myComponents -- go run app.go +``` + +{{% /codetab %}} + +{{% codetab %}} + +In Kubernetes, apply the component to the cluster: + +```bash +kubectl apply -f subscription.yaml +``` + +{{% /codetab %}} + +{{< /tabs >}} + +In your application code, subscribe to the topic specified in the Dapr Pub/sub component. + +{{< tabs ".NET" Java Python JavaScript Go >}} + +{{% codetab %}} + +```csharp + //Subscribe to a topic +[Topic("order_pub_sub", "orders")] +[HttpPost("checkout")] +public void getCheckout([FromBody] int orderId) +{ + Console.WriteLine("Subscriber received : " + orderId); +} +``` + +{{% /codetab %}} + +{{% codetab %}} + +```java + //Subscribe to a topic +@Topic(name = "orders", pubsubName = "order_pub_sub") +@PostMapping(path = "/checkout") +public Mono getCheckout(@RequestBody(required = false) CloudEvent cloudEvent) { + return Mono.fromRunnable(() -> { + try { + log.info("Subscriber received: " + cloudEvent.getData()); + } catch (Exception e) { + throw new RuntimeException(e); + } + }); +} +``` + +{{% /codetab %}} + +{{% codetab %}} + +```python +#Subscribe to a topic +@app.subscribe(pubsub_name='order_pub_sub', topic='orders') +def mytopic(event: v1.Event) -> None: + data = json.loads(event.Data()) + logging.info('Subscriber received: ' + str(data)) + +app.run(6002) +``` + +{{% /codetab %}} + +{{% codetab %}} + +```javascript +//Subscribe to a topic +await server.pubsub.subscribe("order_pub_sub", "orders", async (orderId) => { + console.log(`Subscriber received: ${JSON.stringify(orderId)}`) +}); +await server.startServer(); +``` + +{{% /codetab %}} + +{{% codetab %}} + +```go +//Subscribe to a topic +if err := s.AddTopicEventHandler(sub, eventHandler); err != nil { + log.Fatalf("error adding topic subscription: %v", err) +} +if err := s.Start(); err != nil && err != http.ErrServerClosed { + log.Fatalf("error listenning: %v", err) +} + +func eventHandler(ctx context.Context, e *common.TopicEvent) (retry bool, err error) { + log.Printf("Subscriber received: %s", e.Data) + return false, nil +} +``` + +{{% /codetab %}} + +{{< /tabs >}} + +The `/checkout` endpoint matches the `route` defined in the subscriptions and this is where Dapr will send all topic messages to. + +### Programmatic subscriptions + +The programmatic approach returns the `routes` JSON structure within the code, unlike the declarative approach's `route` YAML structure. In the example below, we define the values found in the [declarative YAML subscription](#declarative-subscriptions) above within the application code. + +{{< tabs ".NET" Java Python JavaScript Go>}} + +{{% codetab %}} + +```csharp +[Topic("order_pub_sub", "checkout", event.type ==\"order\"")] +[HttpPost("orders")] +public async Task> HandleCheckout(Checkout checkout, [FromServices] DaprClient daprClient) +{ + // Logic + return stock; +} +``` + +{{% /codetab %}} + +{{% codetab %}} + +```java + +``` + +{{% /codetab %}} + +{{% codetab %}} + +```python +@app.route('/dapr/subscribe', methods=['GET']) +def subscribe(): + subscriptions = [ + { + 'pubsubname': 'order_pub_sub', + 'topic': 'checkout', + 'routes': { + 'rules': [ + { + 'match': 'event.type == "order"', + 'path': '/orders' + }, + ], + 'default': '/orders' + } + }] + return jsonify(subscriptions) + +@app.route('/orders', methods=['POST']) +def ds_subscriber(): + print(request.json, flush=True) + return json.dumps({'success':True}), 200, {'ContentType':'application/json'} +app.run() +``` + +{{% /codetab %}} + +{{% codetab %}} + +```javascript +const express = require('express') +const bodyParser = require('body-parser') +const app = express() +app.use(bodyParser.json({ type: 'application/*+json' })); + +const port = 3000 + +app.get('/dapr/subscribe', (req, res) => { + res.json([ + { + pubsubname: "order_pub_sub", + topic: "checkout", + routes: { + rules: [ + { + match: 'event.type == "order"', + path: '/orders' + }, + ], + default: '/products' + } + } + ]); +}) + +app.post('/orders', (req, res) => { + console.log(req.body); + res.sendStatus(200); +}); + +app.listen(port, () => console.log(`consumer app listening on port ${port}!`)) +``` + +{{% /codetab %}} + +{{% codetab %}} + +```go +package main + + "encoding/json" + "fmt" + "log" + "net/http" + + "github.com/gorilla/mux" +) + +const appPort = 3000 + +type subscription struct { + PubsubName string `json:"pubsubname"` + Topic string `json:"topic"` + Metadata map[string]string `json:"metadata,omitempty"` + Routes routes `json:"routes"` +} + +type routes struct { + Rules []rule `json:"rules,omitempty"` + Default string `json:"default,omitempty"` +} + +type rule struct { + Match string `json:"match"` + Path string `json:"path"` +} + +// This handles /dapr/subscribe +func configureSubscribeHandler(w http.ResponseWriter, _ *http.Request) { + t := []subscription{ + { + PubsubName: "order_pub_sub", + Topic: "checkout", + Routes: routes{ + Rules: []rule{ + { + Match: `event.type == "order"`, + Path: "/orders", + }, + }, + Default: "/orders", + }, + }, + } + + w.WriteHeader(http.StatusOK) + json.NewEncoder(w).Encode(t) +} + +func main() { + router := mux.NewRouter().StrictSlash(true) + router.HandleFunc("/dapr/subscribe", configureSubscribeHandler).Methods("GET") + log.Fatal(http.ListenAndServe(fmt.Sprintf(":%d", appPort), router)) +} +``` +{{% /codetab %}} + +{{< /tabs >}} + +## Next Steps + +* Try out the [Pub/sub Quickstart]({{< ref pubsub-quickstart.md >}}) +* Follow: [How-To: Configure Pub/sub components with multiple namespaces]({{< ref pubsub-namespaces.md >}}) +* Learn more about [declarative and programmatic subscription methods]({{< ref subscription-methods >}}). +* 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 >}}) From dac2eb025bbc744357ee4d9af0194d9617cc374a Mon Sep 17 00:00:00 2001 From: Hannah Hunter Date: Wed, 18 May 2022 16:37:00 -0500 Subject: [PATCH 2/8] updates after talk w Mark Signed-off-by: Hannah Hunter --- .../pubsub/custom-cloudevent.md | 53 -- .../pubsub/howto-publish-subscribe.md | 640 +++++++++++++++++- .../{pubsub-raw.md => pubsub-cloudevents.md} | 121 +++- .../building-blocks/pubsub/pubsub-overview.md | 114 ++-- .../pubsub/subscription-methods.md | 6 +- .../content/en/reference/api/pubsub_api.md | 4 +- 6 files changed, 824 insertions(+), 114 deletions(-) delete mode 100644 daprdocs/content/en/developing-applications/building-blocks/pubsub/custom-cloudevent.md rename daprdocs/content/en/developing-applications/building-blocks/pubsub/{pubsub-raw.md => pubsub-cloudevents.md} (50%) diff --git a/daprdocs/content/en/developing-applications/building-blocks/pubsub/custom-cloudevent.md b/daprdocs/content/en/developing-applications/building-blocks/pubsub/custom-cloudevent.md deleted file mode 100644 index d73bf963355..00000000000 --- a/daprdocs/content/en/developing-applications/building-blocks/pubsub/custom-cloudevent.md +++ /dev/null @@ -1,53 +0,0 @@ ---- -type: docs -title: "Use a custom CloudEvent" -linkTitle: "Custom CloudEvent" -weight: 8000 -description: "Take the default Dapr CloudEvent wrapping a step further with your own custom CloudEvent" ---- - -## Sending a custom CloudEvent - -Dapr automatically takes the data sent on the publish request and [wraps it in a CloudEvent 1.0 envelope]({{< ref "pubsub-overview.md#cloud-events-message-format" >}}). If you want to use your own custom CloudEvent, make sure to specify the [content type]({{< ref "pubsub-overview.md#content-types" >}}) as `application/cloudevents+json`. - -### Example - -{{< tabs "Dapr CLI" "HTTP API (Bash)" "HTTP API (PowerShell)">}} - -{{% codetab %}} - -Publish a custom CloudEvent to the `orders` topic: - -```bash -dapr publish --publish-app-id orderprocessing --pubsub order-pub-sub --topic orders --data '{"specversion" : "1.0", "type" : "com.dapr.cloudevent.sent", "source" : "testcloudeventspubsub", "subject" : "Cloud Events Test", "id" : "someCloudEventId", "time" : "2021-08-02T09:00:00Z", "datacontenttype" : "application/cloudevents+json", "data" : {"orderId": "100"}}' -``` - -{{% /codetab %}} - -{{% codetab %}} - -Publish a custom CloudEvent to the `orders` topic: - -```bash -curl -X POST http://localhost:3601/v1.0/publish/order-pub-sub/orders -H "Content-Type: application/cloudevents+json" -d '{"specversion" : "1.0", "type" : "com.dapr.cloudevent.sent", "source" : "testcloudeventspubsub", "subject" : "Cloud Events Test", "id" : "someCloudEventId", "time" : "2021-08-02T09:00:00Z", "datacontenttype" : "application/cloudevents+json", "data" : {"orderId": "100"}}' -``` - -{{% /codetab %}} - -{{% codetab %}} - -Publish a custom CloudEvent to the `orders` topic: - -```powershell -Invoke-RestMethod -Method Post -ContentType 'application/cloudevents+json' -Body '{"specversion" : "1.0", "type" : "com.dapr.cloudevent.sent", "source" : "testcloudeventspubsub", "subject" : "Cloud Events Test", "id" : "someCloudEventId", "time" : "2021-08-02T09:00:00Z", "datacontenttype" : "application/cloudevents+json", "data" : {"orderId": "100"}}' -Uri 'http://localhost:3601/v1.0/publish/order-pub-sub/orders' -``` - -{{% /codetab %}} - -{{< /tabs >}} - -## Next steps - -- Try out the [Pub/sub Quickstart]({{< ref pubsub-quickstart.md >}}) -- List of [Pub/sub components]({{< ref setup-pubsub >}}) -- Read the [API reference]({{< ref pubsub_api.md >}}) diff --git a/daprdocs/content/en/developing-applications/building-blocks/pubsub/howto-publish-subscribe.md b/daprdocs/content/en/developing-applications/building-blocks/pubsub/howto-publish-subscribe.md index 441eea076d5..1a5ef9435ca 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/pubsub/howto-publish-subscribe.md +++ b/daprdocs/content/en/developing-applications/building-blocks/pubsub/howto-publish-subscribe.md @@ -1,10 +1,646 @@ --- type: docs -title: "How-To: Publish a message and subscribe to a topic" -linkTitle: "How-To: Publish & subscribe" +title: "Publish a message and subscribe to a topic" +linkTitle: "Publish & subscribe to topics" weight: 2000 description: "Learn how to send messages to a topic with one service and subscribe to that topic in another service" --- + +Now that you've learned what the Dapr Pub/sub building block provides, learn how it can work in your service. The below code example loosely describes an application that processes orders with two services, each with Dapr sidecars: + +- An order processing service using Dapr to publish a message to RabbitMQ. +- A checkout service using Dapr to subscribe to the topic in the message queue. + +Diagram showing state management of example service + +## Setup the Pub/Sub component +The following example creates applications to publish and subscribe to a topic called `orders`. + +The first step is to setup the Pub/Sub component: + +{{< tabs "Self-Hosted (CLI)" Kubernetes >}} + +{{% codetab %}} +The pubsub.yaml is created by default on your local machine when running `dapr init`. Verify by opening your components file under `%UserProfile%\.dapr\components\pubsub.yaml` on Windows or `~/.dapr/components/pubsub.yaml` on Linux/MacOS. + +In this example, RabbitMQ is used for publish and subscribe. Replace `pubsub.yaml` file contents with the below contents. + +```yaml +apiVersion: dapr.io/v1alpha1 +kind: Component +metadata: + name: order-pub-sub +spec: + type: pubsub.rabbitmq + version: v1 + metadata: + - name: host + value: "amqp://localhost:5672" + - name: durable + value: "false" + - name: deletedWhenUnused + value: "false" + - name: autoAck + value: "false" + - name: reconnectWait + value: "0" + - name: concurrency + value: parallel +scopes: + - orderprocessing + - checkout +``` + +You can override this file with another Redis instance or another [pubsub component]({{< ref setup-pubsub >}}) by creating a `components` directory containing the file and using the flag `--components-path` with the `dapr run` CLI command. +{{% /codetab %}} + +{{% codetab %}} +To deploy this into a Kubernetes cluster, fill in the `metadata` connection details of your [desired pubsub component]({{< ref setup-pubsub >}}) in the yaml below, save as `pubsub.yaml`, and run `kubectl apply -f pubsub.yaml`. + +```yaml +apiVersion: dapr.io/v1alpha1 +kind: Component +metadata: + name: order-pub-sub + namespace: default +spec: + type: pubsub.rabbitmq + version: v1 + metadata: + - name: host + value: "amqp://localhost:5672" + - name: durable + value: "false" + - name: deletedWhenUnused + value: "false" + - name: autoAck + value: "false" + - name: reconnectWait + value: "0" + - name: concurrency + value: parallel +scopes: + - orderprocessing + - checkout +``` +{{% /codetab %}} + +{{< /tabs >}} + + +## Step 2: Subscribe to topics + +Dapr allows two methods by which you can subscribe to topics: + +- **Declaratively**, where subscriptions are defined in an external file. +- **Programmatically**, where subscriptions are defined in user code. + +Learn more in the [declarative and programmatic subscriptions doc]({{< ref subscription-methods.md >}}). This example will demonstrate a declarative subscription. + +Create a file named `subscription.yaml` and paste the following: + +```yaml +apiVersion: dapr.io/v1alpha1 +kind: Subscription +metadata: + name: order-pub-sub +spec: + topic: orders + route: /checkout + pubsubname: order-pub-sub +scopes: +- orderprocessing +- checkout +``` + +The example above shows an event subscription to topic `orders`, for the pubsub component `order-pub-sub`. +- The `route` field tells Dapr to send all topic messages to the `/checkout` endpoint in the app. +- The `scopes` field enables this subscription for apps with IDs `orderprocessing` and `checkout`. + +Set the component with: + +Place the CRD in your `./components` directory. When Dapr starts up, it loads subscriptions along with components. + +Note: By default, Dapr loads components from `$HOME/.dapr/components` on MacOS/Linux and `%USERPROFILE%\.dapr\components` on Windows. + +You can also override the default directory by pointing the Dapr CLI to a components path: + +{{< tabs Dotnet Java Python Go Javascript Kubernetes>}} + +{{% codetab %}} + +```bash +dapr run --app-id myapp --components-path ./myComponents -- dotnet run +``` + +{{% /codetab %}} + +{{% codetab %}} + +```bash +dapr run --app-id myapp --components-path ./myComponents -- mvn spring-boot:run +``` + +{{% /codetab %}} + +{{% codetab %}} + +```bash +dapr run --app-id myapp --components-path ./myComponents -- python3 app.py +``` + +{{% /codetab %}} + +{{% codetab %}} + +```bash +dapr run --app-id myapp --components-path ./myComponents -- go run app.go +``` + +{{% /codetab %}} + +{{% codetab %}} + +```bash +dapr run --app-id myapp --components-path ./myComponents -- npm start +``` + +{{% /codetab %}} + +{{% codetab %}} +In Kubernetes, save the CRD to a file and apply it to the cluster: +```bash +kubectl apply -f subscription.yaml +``` +{{% /codetab %}} + +{{< /tabs >}} + +Below are code examples that leverage Dapr SDKs to subscribe to a topic. + +{{< tabs Dotnet Java Python Go Javascript>}} + +{{% codetab %}} + +```csharp +//dependencies +using System.Collections.Generic; +using System.Threading.Tasks; +using System; +using Microsoft.AspNetCore.Mvc; +using Dapr; +using Dapr.Client; + +//code +namespace CheckoutService.controller +{ + [ApiController] + public class CheckoutServiceController : Controller + { + //Subscribe to a topic + [Topic("order-pub-sub", "orders")] + [HttpPost("checkout")] + public void getCheckout([FromBody] int orderId) + { + Console.WriteLine("Subscriber received : " + orderId); + } + } +} +``` + +Navigate to the directory containing the above code, then run the following command to launch a Dapr sidecar and run the application: + +```bash +dapr run --app-id checkout --app-port 6002 --dapr-http-port 3602 --dapr-grpc-port 60002 --app-ssl dotnet run +``` + +{{% /codetab %}} + +{{% codetab %}} + +```java +//dependencies +import io.dapr.Topic; +import io.dapr.client.domain.CloudEvent; +import org.springframework.web.bind.annotation.*; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import reactor.core.publisher.Mono; + +//code +@RestController +public class CheckoutServiceController { + + private static final Logger log = LoggerFactory.getLogger(CheckoutServiceController.class); + //Subscribe to a topic + @Topic(name = "orders", pubsubName = "order-pub-sub") + @PostMapping(path = "/checkout") + public Mono getCheckout(@RequestBody(required = false) CloudEvent cloudEvent) { + return Mono.fromRunnable(() -> { + try { + log.info("Subscriber received: " + cloudEvent.getData()); + } catch (Exception e) { + throw new RuntimeException(e); + } + }); + } +} +``` + +Navigate to the directory containing the above code, then run the following command to launch a Dapr sidecar and run the application: + +```bash +dapr run --app-id checkout --app-port 6002 --dapr-http-port 3602 --dapr-grpc-port 60002 mvn spring-boot:run +``` + +{{% /codetab %}} + +{{% codetab %}} + +```python +#dependencies +from cloudevents.sdk.event import v1 +from dapr.ext.grpc import App +import logging +import json + +#code +app = App() +logging.basicConfig(level = logging.INFO) +#Subscribe to a topic +@app.subscribe(pubsub_name='order-pub-sub', topic='orders') +def mytopic(event: v1.Event) -> None: + data = json.loads(event.Data()) + logging.info('Subscriber received: ' + str(data)) + +app.run(6002) +``` + +Navigate to the directory containing the above code, then run the following command to launch a Dapr sidecar and run the application: + +```bash +dapr run --app-id checkout --app-port 6002 --dapr-http-port 3602 --app-protocol grpc -- python3 CheckoutService.py +``` + +{{% /codetab %}} + +{{% codetab %}} + +```go +//dependencies +import ( + "log" + "net/http" + "context" + + "github.com/dapr/go-sdk/service/common" + daprd "github.com/dapr/go-sdk/service/http" +) + +//code +var sub = &common.Subscription{ + PubsubName: "order-pub-sub", + Topic: "orders", + Route: "/checkout", +} + +func main() { + s := daprd.NewService(":6002") + //Subscribe to a topic + if err := s.AddTopicEventHandler(sub, eventHandler); err != nil { + log.Fatalf("error adding topic subscription: %v", err) + } + if err := s.Start(); err != nil && err != http.ErrServerClosed { + log.Fatalf("error listenning: %v", err) + } +} + +func eventHandler(ctx context.Context, e *common.TopicEvent) (retry bool, err error) { + log.Printf("Subscriber received: %s", e.Data) + return false, nil +} +``` + +Navigate to the directory containing the above code, then run the following command to launch a Dapr sidecar and run the application: + +```bash +dapr run --app-id checkout --app-port 6002 --dapr-http-port 3602 --dapr-grpc-port 60002 go run CheckoutService.go +``` + +{{% /codetab %}} + +{{% codetab %}} + +```javascript +//dependencies +import { DaprServer, CommunicationProtocolEnum } from 'dapr-client'; + +//code +const daprHost = "127.0.0.1"; +const serverHost = "127.0.0.1"; +const serverPort = "6002"; + +start().catch((e) => { + console.error(e); + process.exit(1); +}); + +async function start(orderId) { + const server = new DaprServer( + serverHost, + serverPort, + daprHost, + process.env.DAPR_HTTP_PORT, + CommunicationProtocolEnum.HTTP + ); + //Subscribe to a topic + await server.pubsub.subscribe("order-pub-sub", "orders", async (orderId) => { + console.log(`Subscriber received: ${JSON.stringify(orderId)}`) + }); + await server.startServer(); +} +``` + +Navigate to the directory containing the above code, then run the following command to launch a Dapr sidecar and run the application: + +```bash +dapr run --app-id checkout --app-port 6002 --dapr-http-port 3602 --dapr-grpc-port 60002 npm start +``` + +{{% /codetab %}} + +{{< /tabs >}} + +The `/checkout` endpoint matches the `route` defined in the subscriptions and this is where Dapr will send all topic messages to. + +## Step 3: Publish a topic + +Start an instance of Dapr with an app-id called `orderprocessing`: + +```bash +dapr run --app-id orderprocessing --dapr-http-port 3601 +``` +{{< tabs "Dapr CLI" "HTTP API (Bash)" "HTTP API (PowerShell)">}} + +{{% codetab %}} + +Then publish a message to the `orders` topic: + +```bash +dapr publish --publish-app-id orderprocessing --pubsub order-pub-sub --topic orders --data '{"orderId": "100"}' +``` +{{% /codetab %}} + +{{% codetab %}} +Then publish a message to the `orders` topic: +```bash +curl -X POST http://localhost:3601/v1.0/publish/order-pub-sub/orders -H "Content-Type: application/json" -d '{"orderId": "100"}' +``` +{{% /codetab %}} + +{{% codetab %}} +Then publish a message to the `orders` topic: +```powershell +Invoke-RestMethod -Method Post -ContentType 'application/json' -Body '{"orderId": "100"}' -Uri 'http://localhost:3601/v1.0/publish/order-pub-sub/orders' +``` +{{% /codetab %}} + +{{< /tabs >}} + +Dapr automatically wraps the user payload in a Cloud Events v1.0 compliant envelope, using `Content-Type` header value for `datacontenttype` attribute. + +Below are code examples that leverage Dapr SDKs to publish a topic. + +{{< tabs Dotnet Java Python Go Javascript>}} + +{{% codetab %}} + +```csharp +//dependencies +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Threading.Tasks; +using Dapr.Client; +using Microsoft.AspNetCore.Mvc; +using System.Threading; + +//code +namespace EventService +{ + class Program + { + static async Task Main(string[] args) + { + string PUBSUB_NAME = "order-pub-sub"; + string TOPIC_NAME = "orders"; + while(true) { + System.Threading.Thread.Sleep(5000); + Random random = new Random(); + int orderId = random.Next(1,1000); + CancellationTokenSource source = new CancellationTokenSource(); + CancellationToken cancellationToken = source.Token; + using var client = new DaprClientBuilder().Build(); + //Using Dapr SDK to publish a topic + await client.PublishEventAsync(PUBSUB_NAME, TOPIC_NAME, orderId, cancellationToken); + Console.WriteLine("Published data: " + orderId); + } + } + } +} +``` + +Navigate to the directory containing the above code, then run the following command to launch a Dapr sidecar and run the application: + +```bash +dapr run --app-id orderprocessing --app-port 6001 --dapr-http-port 3601 --dapr-grpc-port 60001 --app-ssl dotnet run +``` + +{{% /codetab %}} + +{{% codetab %}} + +```java +//dependencies +import io.dapr.client.DaprClient; +import io.dapr.client.DaprClientBuilder; +import io.dapr.client.domain.Metadata; +import static java.util.Collections.singletonMap; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import java.util.Random; +import java.util.concurrent.TimeUnit; + +//code +@SpringBootApplication +public class OrderProcessingServiceApplication { + + private static final Logger log = LoggerFactory.getLogger(OrderProcessingServiceApplication.class); + + public static void main(String[] args) throws InterruptedException{ + String MESSAGE_TTL_IN_SECONDS = "1000"; + String TOPIC_NAME = "orders"; + String PUBSUB_NAME = "order-pub-sub"; + + while(true) { + TimeUnit.MILLISECONDS.sleep(5000); + Random random = new Random(); + int orderId = random.nextInt(1000-1) + 1; + DaprClient client = new DaprClientBuilder().build(); + //Using Dapr SDK to publish a topic + client.publishEvent( + PUBSUB_NAME, + TOPIC_NAME, + orderId, + singletonMap(Metadata.TTL_IN_SECONDS, MESSAGE_TTL_IN_SECONDS)).block(); + log.info("Published data:" + orderId); + } + } +} +``` + +Navigate to the directory containing the above code, then run the following command to launch a Dapr sidecar and run the application: + +```bash +dapr run --app-id orderprocessing --app-port 6001 --dapr-http-port 3601 --dapr-grpc-port 60001 mvn spring-boot:run +``` + +{{% /codetab %}} + +{{% codetab %}} + +```python +#dependencies +import random +from time import sleep +import requests +import logging +import json +from dapr.clients import DaprClient + +#code +logging.basicConfig(level = logging.INFO) +while True: + sleep(random.randrange(50, 5000) / 1000) + orderId = random.randint(1, 1000) + PUBSUB_NAME = 'order-pub-sub' + TOPIC_NAME = 'orders' + with DaprClient() as client: + #Using Dapr SDK to publish a topic + result = client.publish_event( + pubsub_name=PUBSUB_NAME, + topic_name=TOPIC_NAME, + data=json.dumps(orderId), + data_content_type='application/json', + ) + logging.info('Published data: ' + str(orderId)) +``` + +Navigate to the directory containing the above code, then run the following command to launch a Dapr sidecar and run the application: + +```bash +dapr run --app-id orderprocessing --app-port 6001 --dapr-http-port 3601 --app-protocol grpc python3 OrderProcessingService.py +``` + +{{% /codetab %}} + +{{% codetab %}} + +```go +//dependencies +import ( + "context" + "log" + "math/rand" + "time" + "strconv" + dapr "github.com/dapr/go-sdk/client" +) + +//code +var ( + PUBSUB_NAME = "order-pub-sub" + TOPIC_NAME = "orders" +) + +func main() { + for i := 0; i < 10; i++ { + time.Sleep(5000) + orderId := rand.Intn(1000-1) + 1 + client, err := dapr.NewClient() + if err != nil { + panic(err) + } + defer client.Close() + ctx := context.Background() + //Using Dapr SDK to publish a topic + if err := client.PublishEvent(ctx, PUBSUB_NAME, TOPIC_NAME, []byte(strconv.Itoa(orderId))); + err != nil { + panic(err) + } + + log.Println("Published data: " + strconv.Itoa(orderId)) + } +} +``` + +Navigate to the directory containing the above code, then run the following command to launch a Dapr sidecar and run the application: + +```bash +dapr run --app-id orderprocessing --app-port 6001 --dapr-http-port 3601 --dapr-grpc-port 60001 go run OrderProcessingService.go +``` + +{{% /codetab %}} + +{{% codetab %}} + +```javascript +//dependencies +import { DaprServer, DaprClient, CommunicationProtocolEnum } from 'dapr-client'; + +const daprHost = "127.0.0.1"; + +var main = function() { + for(var i=0;i<10;i++) { + sleep(5000); + var orderId = Math.floor(Math.random() * (1000 - 1) + 1); + start(orderId).catch((e) => { + console.error(e); + process.exit(1); + }); + } +} + +async function start(orderId) { + const PUBSUB_NAME = "order-pub-sub" + const TOPIC_NAME = "orders" + const client = new DaprClient(daprHost, process.env.DAPR_HTTP_PORT, CommunicationProtocolEnum.HTTP); + console.log("Published data:" + orderId) + //Using Dapr SDK to publish a topic + await client.pubsub.publish(PUBSUB_NAME, TOPIC_NAME, orderId); +} + +function sleep(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); +} + +main(); +``` + +Navigate to the directory containing the above code, then run the following command to launch a Dapr sidecar and run the application: + +```bash +dapr run --app-id orderprocessing --app-port 6001 --dapr-http-port 3601 --dapr-grpc-port 60001 npm start +``` + +{{% /codetab %}} + +{{< /tabs >}} + + ## Step 4: ACK-ing a message In order to tell Dapr that a message was processed successfully, return a `200 OK` response. If Dapr receives any other return status code than `200`, or if your app crashes, Dapr will attempt to redeliver the message following at-least-once semantics. diff --git a/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-raw.md b/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-cloudevents.md similarity index 50% rename from daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-raw.md rename to daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-cloudevents.md index c75288366e7..6ee1b3dbf32 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-raw.md +++ b/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-cloudevents.md @@ -1,25 +1,68 @@ --- type: docs -title: "Pub/Sub without CloudEvents" -linkTitle: "Pub/Sub without CloudEvents" -weight: 7000 -description: "Use Pub/Sub without CloudEvents." +title: "CloudEvents in Dapr Pub/Sub" +linkTitle: "CloudEvents" +weight: 2200 +description: "Learn why Dapr uses CloudEvents, how they work in Dapr Pub/Sub, and how to disable CloudEvents." --- -## Introduction +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 CloudEvents envelope, using the [`Content-Type` header value]({{< ref "pubsub-overview.md#content-types" >}}) for `datacontenttype` attribute. Dapr uses CloudEvents to provide additional context to the event payload, enabling features like: -* Tracing -* Deduplication by message Id -* Content-type for proper deserialization of event's data -For more information about CloudEvents, read the [CloudEvents specification](https://github.com/cloudevents/spec). +- Tracing +- Deduplication by message Id +- Content-type for proper deserialization of event data + +When adding Dapr to your application, some services may still need to communicate via raw Pub/Sub messages not encapsulated in CloudEvents, due to either compatibility reasons or some apps not using Dapr. Dapr enables apps to [publish and subscribe to raw events]({{< ref "pubsub-cloudevents.md#publishing-raw-messages" >}}) not wrapped in a CloudEvent. + +## CloudEvents example + +Dapr implements the following CloudEvents fields when creating a message topic. + +- `id` +- `source` +- `specversion` +- `type` +- `traceparent` +- `datacontenttype` (optional) + +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 +{ + "specversion" : "1.0", + "type" : "xml.message", + "source" : "https://example.com/message", + "subject" : "Test XML Message", + "id" : "id-1234-5678-9101", + "time" : "2020-09-23T06:23:21Z", + "datacontenttype" : "text/xml", + "data" : "User1user2hi" +} +``` -When adding Dapr to your application, some services may still need to communicate via raw pub/sub messages not encapsulated in CloudEvents. This may be for compatibility reasons, or because some apps are not using Dapr. Dapr enables apps to publish and subscribe to raw events that are not wrapped in a CloudEvent. -{{% alert title="Warning" color="warning" %}} -Not using CloudEvents disables support for tracing, event deduplication per messageId, content-type metadata, and any other features built using the CloudEvent schema. -{{% /alert %}} ## Publishing raw messages @@ -27,6 +70,10 @@ Dapr apps are able to publish raw events to pub/sub topics without CloudEvent en Diagram showing how to publish with Dapr when subscriber does not use Dapr or CloudEvent +{{% alert title="Warning" color="warning" %}} +Not using CloudEvents disables support for tracing, event deduplication per messageId, content-type metadata, and any other features built using the CloudEvent schema. +{{% /alert %}} + To disable CloudEvent wrapping, set the `rawPayload` metadata to `true` as part of the publishing request. This allows subscribers to receive these messages without having to parse the CloudEvent schema. {{< tabs curl "Python SDK" "PHP SDK">}} @@ -170,3 +217,51 @@ scopes: - Learn more about [publishing and subscribing messages]({{< ref pubsub-overview.md >}}) - List of [pub/sub components]({{< ref supported-pubsub >}}) - Read the [API reference]({{< ref pubsub_api.md >}}) + + + +## Custom CloudEvents + +Dapr automatically takes the data sent on the publish request and [wraps it in a CloudEvent 1.0 envelope]({{< ref "pubsub-overview.md#cloud-events-message-format" >}}). If you want to use your own custom CloudEvent, make sure to specify the [content type]({{< ref "pubsub-overview.md#content-types" >}}) as `application/cloudevents+json`. + +### Example + +{{< tabs "Dapr CLI" "HTTP API (Bash)" "HTTP API (PowerShell)">}} + +{{% codetab %}} + +Publish a custom CloudEvent to the `orders` topic: + +```bash +dapr publish --publish-app-id orderprocessing --pubsub order-pub-sub --topic orders --data '{"specversion" : "1.0", "type" : "com.dapr.cloudevent.sent", "source" : "testcloudeventspubsub", "subject" : "Cloud Events Test", "id" : "someCloudEventId", "time" : "2021-08-02T09:00:00Z", "datacontenttype" : "application/cloudevents+json", "data" : {"orderId": "100"}}' +``` + +{{% /codetab %}} + +{{% codetab %}} + +Publish a custom CloudEvent to the `orders` topic: + +```bash +curl -X POST http://localhost:3601/v1.0/publish/order-pub-sub/orders -H "Content-Type: application/cloudevents+json" -d '{"specversion" : "1.0", "type" : "com.dapr.cloudevent.sent", "source" : "testcloudeventspubsub", "subject" : "Cloud Events Test", "id" : "someCloudEventId", "time" : "2021-08-02T09:00:00Z", "datacontenttype" : "application/cloudevents+json", "data" : {"orderId": "100"}}' +``` + +{{% /codetab %}} + +{{% codetab %}} + +Publish a custom CloudEvent to the `orders` topic: + +```powershell +Invoke-RestMethod -Method Post -ContentType 'application/cloudevents+json' -Body '{"specversion" : "1.0", "type" : "com.dapr.cloudevent.sent", "source" : "testcloudeventspubsub", "subject" : "Cloud Events Test", "id" : "someCloudEventId", "time" : "2021-08-02T09:00:00Z", "datacontenttype" : "application/cloudevents+json", "data" : {"orderId": "100"}}' -Uri 'http://localhost:3601/v1.0/publish/order-pub-sub/orders' +``` + +{{% /codetab %}} + +{{< /tabs >}} + +## Next steps + +- Try out the [Pub/sub Quickstart]({{< ref pubsub-quickstart.md >}}) +- List of [Pub/sub components]({{< ref setup-pubsub >}}) +- Read the [API reference]({{< ref pubsub_api.md >}}) 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 740121a0fdb..ac03f404d6b 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,16 +98,20 @@ 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`. +Unless specified, Dapr will assume `text/plain`. 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. @@ -95,17 +120,19 @@ Dapr applications can subscribe to published topics via two methods that support | **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: [Declarative vs. Programmatic]({{< ref subscription-methods >}}). +For more information, read [about the subscriptions in the how-to]({{< ref howto-publish-subscribe.md >}}). + +### Message routing -### Message delivery +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,21 +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-cloudevents.md#publishing-raw-messages" >}}). -### Publish/Subscribe API +## Try it out -The publish/subscribe API is located in the [API reference document]({{< ref pubsub_api.md >}}). +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 -* Try out the [Pub/sub Quickstart]({{< ref pubsub-quickstart.md >}}) -* Follow the [How-To: Configure Pub/sub components with multiple namespaces]({{< ref pubsub-namespaces.md >}}) -* Learn more about [declarative and programmatic subscription methods]({{< ref subscription-methods >}}). -- Learn about [topic scoping]({{< ref pubsub-scopes.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 more about [Pub/Sub with and without CloudEvent]({{< ref pubsub-cloudevents.md >}}) +* List of [Pub/Sub components]({{< ref supported-pubsub.md >}}) +* Read the [Pub/Sub API reference]({{< ref pubsub_api.md >}}) + diff --git a/daprdocs/content/en/developing-applications/building-blocks/pubsub/subscription-methods.md b/daprdocs/content/en/developing-applications/building-blocks/pubsub/subscription-methods.md index b496b1f5d0b..5f75e83cceb 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/pubsub/subscription-methods.md +++ b/daprdocs/content/en/developing-applications/building-blocks/pubsub/subscription-methods.md @@ -1,7 +1,7 @@ --- type: docs -title: "Declarative vs. programmatic subscription methods" -linkTitle: "Declarative vs. programmatic" +title: "Declarative and programmatic subscription methods" +linkTitle: "Subscription methods" weight: 3000 description: "Learn more about the two methods by which Dapr allows you to subscribe to topics." --- @@ -348,6 +348,6 @@ func main() { * Learn more about [declarative and programmatic subscription methods]({{< ref subscription-methods >}}). * 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 >}}) +* Learn more about [Pub/Sub with and without CloudEvent]({{< ref pubsub-cloudevents.md >}}) * List of [Pub/sub components]({{< ref supported-pubsub.md >}}) * Read the [Pub/sub API reference]({{< ref pubsub_api.md >}}) diff --git a/daprdocs/content/en/reference/api/pubsub_api.md b/daprdocs/content/en/reference/api/pubsub_api.md index a09ea6a8e37..6f756dcd519 100644 --- a/daprdocs/content/en/reference/api/pubsub_api.md +++ b/daprdocs/content/en/reference/api/pubsub_api.md @@ -60,7 +60,7 @@ Metadata can be sent via query parameters in the request's URL. It must be prefi Parameter | Description --------- | ----------- `metadata.ttlInSeconds` | The number of seconds for the message to expire, as [described here]({{< ref pubsub-message-ttl.md >}}) -`metadata.rawPayload` | Boolean to determine if Dapr should publish the event without wrapping it as CloudEvent, as [described here]({{< ref pubsub-raw.md >}}) +`metadata.rawPayload` | Boolean to determine if Dapr should publish the event without wrapping it as CloudEvent, as [described here]({{< ref "pubsub-cloudevents.md#publishing-raw-messages" >}}) > Additional metadata parameters are available based on each pubsub component. @@ -109,7 +109,7 @@ Optionally, metadata can be sent via the request body. Parameter | Description --------- | ----------- -`rawPayload` | boolean to subscribe to events that do not comply with CloudEvent specification, as [described here]({{< ref pubsub-raw.md >}}) +`rawPayload` | boolean to subscribe to events that do not comply with CloudEvent specification, as [described here]({{< ref "pubsub-cloudevents.md#publishing-raw-messages" >}}) ### Provide route(s) for Dapr to deliver topic events From a47aef9b68035216fc91d5de987234cd6ae65665 Mon Sep 17 00:00:00 2001 From: Hannah Hunter Date: Thu, 19 May 2022 09:23:31 -0500 Subject: [PATCH 3/8] break up cloudevents into two articles Signed-off-by: Hannah Hunter --- .../pubsub/howto-route-messages.md | 2 +- .../pubsub/pubsub-cloudevents.md | 167 +----------------- .../building-blocks/pubsub/pubsub-overview.md | 4 +- .../building-blocks/pubsub/pubsub-raw.md | 166 +++++++++++++++++ .../content/en/reference/api/pubsub_api.md | 4 +- 5 files changed, 176 insertions(+), 167 deletions(-) create mode 100644 daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-raw.md diff --git a/daprdocs/content/en/developing-applications/building-blocks/pubsub/howto-route-messages.md b/daprdocs/content/en/developing-applications/building-blocks/pubsub/howto-route-messages.md index 5fac6c647b2..bb7aa7bbd95 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/pubsub/howto-route-messages.md +++ b/daprdocs/content/en/developing-applications/building-blocks/pubsub/howto-route-messages.md @@ -2,7 +2,7 @@ type: docs title: "How-To: Route messages to different event handlers" linkTitle: "How-To: Route events" -weight: 2100 +weight: 2300 description: "Learn how to route messages from a topic to different event handlers based on CloudEvent fields" --- diff --git a/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-cloudevents.md b/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-cloudevents.md index 6ee1b3dbf32..8fd55523d8e 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-cloudevents.md +++ b/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-cloudevents.md @@ -1,9 +1,9 @@ --- type: docs -title: "CloudEvents in Dapr Pub/Sub" -linkTitle: "CloudEvents" -weight: 2200 -description: "Learn why Dapr uses CloudEvents, how they work in Dapr Pub/Sub, and how to disable CloudEvents." +title: "Publishing & subscribing messages with Cloudevents" +linkTitle: "Messages with Cloudevents" +weight: 2100 +description: "Learn why Dapr uses CloudEvents, how they work in Dapr Pub/Sub, and how to create CloudEvents." --- 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 CloudEvents envelope, using the [`Content-Type` header value]({{< ref "pubsub-overview.md#content-types" >}}) for `datacontenttype` attribute. @@ -14,7 +14,6 @@ Dapr uses CloudEvents to provide additional context to the event payload, enabli - Deduplication by message Id - Content-type for proper deserialization of event data -When adding Dapr to your application, some services may still need to communicate via raw Pub/Sub messages not encapsulated in CloudEvents, due to either compatibility reasons or some apps not using Dapr. Dapr enables apps to [publish and subscribe to raw events]({{< ref "pubsub-cloudevents.md#publishing-raw-messages" >}}) not wrapped in a CloudEvent. ## CloudEvents example @@ -63,163 +62,6 @@ As another example of a v1.0 CloudEvent, the following shows data as XML content ``` - -## Publishing raw messages - -Dapr apps are able to publish raw events to pub/sub topics without CloudEvent encapsulation, for compatibility with non-Dapr apps. - -Diagram showing how to publish with Dapr when subscriber does not use Dapr or CloudEvent - -{{% alert title="Warning" color="warning" %}} -Not using CloudEvents disables support for tracing, event deduplication per messageId, content-type metadata, and any other features built using the CloudEvent schema. -{{% /alert %}} - -To disable CloudEvent wrapping, set the `rawPayload` metadata to `true` as part of the publishing request. This allows subscribers to receive these messages without having to parse the CloudEvent schema. - -{{< tabs curl "Python SDK" "PHP SDK">}} - -{{% codetab %}} -```bash -curl -X "POST" http://localhost:3500/v1.0/publish/pubsub/TOPIC_A?metadata.rawPayload=true -H "Content-Type: application/json" -d '{"order-number": "345"}' -``` -{{% /codetab %}} - -{{% codetab %}} -```python -from dapr.clients import DaprClient - -with DaprClient() as d: - req_data = { - 'order-number': '345' - } - # Create a typed message with content type and body - resp = d.publish_event( - pubsub_name='pubsub', - topic_name='TOPIC_A', - data=json.dumps(req_data), - publish_metadata={'rawPayload': 'true'} - ) - # Print the request - print(req_data, flush=True) -``` -{{% /codetab %}} - -{{% codetab %}} - -```php -run(function(\DI\FactoryInterface $factory) { - $publisher = $factory->make(\Dapr\PubSub\Publish::class, ['pubsub' => 'pubsub']); - $publisher->topic('TOPIC_A')->publish('data', ['rawPayload' => 'true']); -}); -``` - -{{% /codetab %}} - -{{< /tabs >}} - -## Subscribing to raw messages - -Dapr apps are also able to subscribe to raw events coming from existing pub/sub topics that do not use CloudEvent encapsulation. - -Diagram showing how to subscribe with Dapr when publisher does not use Dapr or CloudEvent - -### Programmatically subscribe to raw events - -When subscribing programmatically, add the additional metadata entry for `rawPayload` so the Dapr sidecar automatically wraps the payloads into a CloudEvent that is compatible with current Dapr SDKs. - -{{< tabs "Python" "PHP SDK" >}} - -{{% codetab %}} - -```python -import flask -from flask import request, jsonify -from flask_cors import CORS -import json -import sys - -app = flask.Flask(__name__) -CORS(app) - -@app.route('/dapr/subscribe', methods=['GET']) -def subscribe(): - subscriptions = [{'pubsubname': 'pubsub', - 'topic': 'deathStarStatus', - 'route': 'dsstatus', - 'metadata': { - 'rawPayload': 'true', - } }] - return jsonify(subscriptions) - -@app.route('/dsstatus', methods=['POST']) -def ds_subscriber(): - print(request.json, flush=True) - return json.dumps({'success':True}), 200, {'ContentType':'application/json'} - -app.run() -``` - -{{% /codetab %}} -{{% codetab %}} - -```php - $builder->addDefinitions(['dapr.subscriptions' => [ - new \Dapr\PubSub\Subscription(pubsubname: 'pubsub', topic: 'deathStarStatus', route: '/dsstatus', metadata: [ 'rawPayload' => 'true'] ), -]])); - -$app->post('/dsstatus', function( - #[\Dapr\Attributes\FromBody] - \Dapr\PubSub\CloudEvent $cloudEvent, - \Psr\Log\LoggerInterface $logger - ) { - $logger->alert('Received event: {event}', ['event' => $cloudEvent]); - return ['status' => 'SUCCESS']; - } -); - -$app->start(); -``` -{{% /codetab %}} - -{{< /tabs >}} - -## Declaratively subscribe to raw events - -Similarly, you can subscribe to raw events declaratively by adding the `rawPayload` metadata entry to your Subscription Custom Resource Definition (CRD): - -```yaml -apiVersion: dapr.io/v1alpha1 -kind: Subscription -metadata: - name: myevent-subscription -spec: - topic: deathStarStatus - route: /dsstatus - pubsubname: pubsub - metadata: - rawPayload: "true" -scopes: -- app1 -- app2 -``` - -## Next steps - -- Learn more about [publishing and subscribing messages]({{< ref pubsub-overview.md >}}) -- List of [pub/sub components]({{< ref supported-pubsub >}}) -- Read the [API reference]({{< ref pubsub_api.md >}}) - - - ## Custom CloudEvents Dapr automatically takes the data sent on the publish request and [wraps it in a CloudEvent 1.0 envelope]({{< ref "pubsub-overview.md#cloud-events-message-format" >}}). If you want to use your own custom CloudEvent, make sure to specify the [content type]({{< ref "pubsub-overview.md#content-types" >}}) as `application/cloudevents+json`. @@ -265,3 +107,4 @@ Invoke-RestMethod -Method Post -ContentType 'application/cloudevents+json' -Body - Try out the [Pub/sub Quickstart]({{< ref pubsub-quickstart.md >}}) - List of [Pub/sub components]({{< ref setup-pubsub >}}) - Read the [API reference]({{< ref pubsub_api.md >}}) + 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 ac03f404d6b..64fdc9260b5 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 @@ -162,7 +162,7 @@ For more information, read [Pub/Sub message TTL]({{< ref pubsub-message-ttl.md > 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 CloudEvents]({{< ref "pubsub-cloudevents.md#publishing-raw-messages" >}}). +For more information, read [how to use Pub/Sub without CloudEvents]({{< ref pubsub-raw.md >}}). ## Try it out @@ -179,7 +179,7 @@ Want to put the Dapr Pub/Sub API to the test? Walk through the following quickst * 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 more about [Pub/Sub with and without CloudEvent]({{< ref pubsub-cloudevents.md >}}) +* Learn more about [Pub/Sub with and 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 >}}) diff --git a/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-raw.md b/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-raw.md new file mode 100644 index 00000000000..4c09a13f520 --- /dev/null +++ b/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-raw.md @@ -0,0 +1,166 @@ +--- +type: docs +title: "Publishing & subscribing messages without CloudEvents" +linkTitle: "Messages without CloudEvents" +weight: 2200 +description: "Learn when you might not use CloudEvents and how to disable them." +--- + +When adding Dapr to your application, some services may still need to communicate via raw Pub/Sub messages not encapsulated in CloudEvents, due to either compatibility reasons or some apps not using Dapr. Dapr enables apps to [publish and subscribe to raw events]({{< ref "pubsub-cloudevents.md#publishing-raw-messages" >}}) not wrapped in a CloudEvent. + +## Publishing raw messages + +Dapr apps are able to publish raw events to pub/sub topics without CloudEvent encapsulation, for compatibility with non-Dapr apps. + +Diagram showing how to publish with Dapr when subscriber does not use Dapr or CloudEvent + +{{% alert title="Warning" color="warning" %}} +Not using CloudEvents disables support for tracing, event deduplication per messageId, content-type metadata, and any other features built using the CloudEvent schema. +{{% /alert %}} + +To disable CloudEvent wrapping, set the `rawPayload` metadata to `true` as part of the publishing request. This allows subscribers to receive these messages without having to parse the CloudEvent schema. + +{{< tabs curl "Python SDK" "PHP SDK">}} + +{{% codetab %}} +```bash +curl -X "POST" http://localhost:3500/v1.0/publish/pubsub/TOPIC_A?metadata.rawPayload=true -H "Content-Type: application/json" -d '{"order-number": "345"}' +``` +{{% /codetab %}} + +{{% codetab %}} +```python +from dapr.clients import DaprClient + +with DaprClient() as d: + req_data = { + 'order-number': '345' + } + # Create a typed message with content type and body + resp = d.publish_event( + pubsub_name='pubsub', + topic_name='TOPIC_A', + data=json.dumps(req_data), + publish_metadata={'rawPayload': 'true'} + ) + # Print the request + print(req_data, flush=True) +``` +{{% /codetab %}} + +{{% codetab %}} + +```php +run(function(\DI\FactoryInterface $factory) { + $publisher = $factory->make(\Dapr\PubSub\Publish::class, ['pubsub' => 'pubsub']); + $publisher->topic('TOPIC_A')->publish('data', ['rawPayload' => 'true']); +}); +``` + +{{% /codetab %}} + +{{< /tabs >}} + +## Subscribing to raw messages + +Dapr apps are also able to subscribe to raw events coming from existing pub/sub topics that do not use CloudEvent encapsulation. + +Diagram showing how to subscribe with Dapr when publisher does not use Dapr or CloudEvent + +### Programmatically subscribe to raw events + +When subscribing programmatically, add the additional metadata entry for `rawPayload` so the Dapr sidecar automatically wraps the payloads into a CloudEvent that is compatible with current Dapr SDKs. + +{{< tabs "Python" "PHP SDK" >}} + +{{% codetab %}} + +```python +import flask +from flask import request, jsonify +from flask_cors import CORS +import json +import sys + +app = flask.Flask(__name__) +CORS(app) + +@app.route('/dapr/subscribe', methods=['GET']) +def subscribe(): + subscriptions = [{'pubsubname': 'pubsub', + 'topic': 'deathStarStatus', + 'route': 'dsstatus', + 'metadata': { + 'rawPayload': 'true', + } }] + return jsonify(subscriptions) + +@app.route('/dsstatus', methods=['POST']) +def ds_subscriber(): + print(request.json, flush=True) + return json.dumps({'success':True}), 200, {'ContentType':'application/json'} + +app.run() +``` + +{{% /codetab %}} +{{% codetab %}} + +```php + $builder->addDefinitions(['dapr.subscriptions' => [ + new \Dapr\PubSub\Subscription(pubsubname: 'pubsub', topic: 'deathStarStatus', route: '/dsstatus', metadata: [ 'rawPayload' => 'true'] ), +]])); + +$app->post('/dsstatus', function( + #[\Dapr\Attributes\FromBody] + \Dapr\PubSub\CloudEvent $cloudEvent, + \Psr\Log\LoggerInterface $logger + ) { + $logger->alert('Received event: {event}', ['event' => $cloudEvent]); + return ['status' => 'SUCCESS']; + } +); + +$app->start(); +``` +{{% /codetab %}} + +{{< /tabs >}} + +## Declaratively subscribe to raw events + +Similarly, you can subscribe to raw events declaratively by adding the `rawPayload` metadata entry to your Subscription Custom Resource Definition (CRD): + +```yaml +apiVersion: dapr.io/v1alpha1 +kind: Subscription +metadata: + name: myevent-subscription +spec: + topic: deathStarStatus + route: /dsstatus + pubsubname: pubsub + metadata: + rawPayload: "true" +scopes: +- app1 +- app2 +``` + +## Next steps + +- Learn more about [publishing and subscribing messages]({{< ref pubsub-overview.md >}}) +- List of [pub/sub components]({{< ref supported-pubsub >}}) +- Read the [API reference]({{< ref pubsub_api.md >}}) + + + diff --git a/daprdocs/content/en/reference/api/pubsub_api.md b/daprdocs/content/en/reference/api/pubsub_api.md index 6f756dcd519..a09ea6a8e37 100644 --- a/daprdocs/content/en/reference/api/pubsub_api.md +++ b/daprdocs/content/en/reference/api/pubsub_api.md @@ -60,7 +60,7 @@ Metadata can be sent via query parameters in the request's URL. It must be prefi Parameter | Description --------- | ----------- `metadata.ttlInSeconds` | The number of seconds for the message to expire, as [described here]({{< ref pubsub-message-ttl.md >}}) -`metadata.rawPayload` | Boolean to determine if Dapr should publish the event without wrapping it as CloudEvent, as [described here]({{< ref "pubsub-cloudevents.md#publishing-raw-messages" >}}) +`metadata.rawPayload` | Boolean to determine if Dapr should publish the event without wrapping it as CloudEvent, as [described here]({{< ref pubsub-raw.md >}}) > Additional metadata parameters are available based on each pubsub component. @@ -109,7 +109,7 @@ Optionally, metadata can be sent via the request body. Parameter | Description --------- | ----------- -`rawPayload` | boolean to subscribe to events that do not comply with CloudEvent specification, as [described here]({{< ref "pubsub-cloudevents.md#publishing-raw-messages" >}}) +`rawPayload` | boolean to subscribe to events that do not comply with CloudEvent specification, as [described here]({{< ref pubsub-raw.md >}}) ### Provide route(s) for Dapr to deliver topic events From 2eeca34214b38cd3a758b0963ba5afe3bd4f9ea5 Mon Sep 17 00:00:00 2001 From: Hannah Hunter Date: Thu, 19 May 2022 14:06:17 -0500 Subject: [PATCH 4/8] update to overview Signed-off-by: Hannah Hunter --- .../pubsub/pubsub-cloudevents.md | 13 ++-- .../building-blocks/pubsub/pubsub-overview.md | 70 ++++--------------- 2 files changed, 19 insertions(+), 64 deletions(-) diff --git a/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-cloudevents.md b/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-cloudevents.md index 8fd55523d8e..a07de96be54 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-cloudevents.md +++ b/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-cloudevents.md @@ -14,7 +14,6 @@ Dapr uses CloudEvents to provide additional context to the event payload, enabli - Deduplication by message Id - Content-type for proper deserialization of event data - ## CloudEvents example Dapr implements the following CloudEvents fields when creating a message topic. @@ -61,10 +60,9 @@ As another example of a v1.0 CloudEvent, the following shows data as XML content } ``` +## Publish your own CloudEvent -## Custom CloudEvents - -Dapr automatically takes the data sent on the publish request and [wraps it in a CloudEvent 1.0 envelope]({{< ref "pubsub-overview.md#cloud-events-message-format" >}}). If you want to use your own custom CloudEvent, make sure to specify the [content type]({{< ref "pubsub-overview.md#content-types" >}}) as `application/cloudevents+json`. +If you want to use your own CloudEvent, make sure to specify the [content type]({{< ref "pubsub-overview.md#setting-message-content-types" >}}) as `application/cloudevents+json`. ### Example @@ -72,7 +70,7 @@ Dapr automatically takes the data sent on the publish request and [wraps it in a {{% codetab %}} -Publish a custom CloudEvent to the `orders` topic: +Publish a CloudEvent to the `orders` topic: ```bash dapr publish --publish-app-id orderprocessing --pubsub order-pub-sub --topic orders --data '{"specversion" : "1.0", "type" : "com.dapr.cloudevent.sent", "source" : "testcloudeventspubsub", "subject" : "Cloud Events Test", "id" : "someCloudEventId", "time" : "2021-08-02T09:00:00Z", "datacontenttype" : "application/cloudevents+json", "data" : {"orderId": "100"}}' @@ -82,7 +80,7 @@ dapr publish --publish-app-id orderprocessing --pubsub order-pub-sub --topic ord {{% codetab %}} -Publish a custom CloudEvent to the `orders` topic: +Publish a CloudEvent to the `orders` topic: ```bash curl -X POST http://localhost:3601/v1.0/publish/order-pub-sub/orders -H "Content-Type: application/cloudevents+json" -d '{"specversion" : "1.0", "type" : "com.dapr.cloudevent.sent", "source" : "testcloudeventspubsub", "subject" : "Cloud Events Test", "id" : "someCloudEventId", "time" : "2021-08-02T09:00:00Z", "datacontenttype" : "application/cloudevents+json", "data" : {"orderId": "100"}}' @@ -92,7 +90,7 @@ curl -X POST http://localhost:3601/v1.0/publish/order-pub-sub/orders -H "Content {{% codetab %}} -Publish a custom CloudEvent to the `orders` topic: +Publish a CloudEvent to the `orders` topic: ```powershell Invoke-RestMethod -Method Post -ContentType 'application/cloudevents+json' -Body '{"specversion" : "1.0", "type" : "com.dapr.cloudevent.sent", "source" : "testcloudeventspubsub", "subject" : "Cloud Events Test", "id" : "someCloudEventId", "time" : "2021-08-02T09:00:00Z", "datacontenttype" : "application/cloudevents+json", "data" : {"orderId": "100"}}' -Uri 'http://localhost:3601/v1.0/publish/order-pub-sub/orders' @@ -104,6 +102,7 @@ Invoke-RestMethod -Method Post -ContentType 'application/cloudevents+json' -Body ## Next steps +- Learn why you might [not want to use CloudEvents]({{< ref pubsub-raw.md >}}) - Try out the [Pub/sub Quickstart]({{< ref pubsub-quickstart.md >}}) - List of [Pub/sub components]({{< ref setup-pubsub >}}) - Read the [API reference]({{< ref pubsub_api.md >}}) 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 64fdc9260b5..5d53ba752a0 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 @@ -52,62 +52,18 @@ The Pub/Sub building block brings several features to your application. ### Sending messages using Cloud Events -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 when creating a message topic. - -* `id` -* `source` -* `specversion` -* `type` -* `traceparent` -* `datacontenttype` (optional) - -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 -{ - "specversion" : "1.0", - "type" : "xml.message", - "source" : "https://example.com/message", - "subject" : "Test XML Message", - "id" : "id-1234-5678-9101", - "time" : "2020-09-23T06:23:21Z", - "datacontenttype" : "text/xml", - "data" : "User1user2hi" -} -``` - -#### 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`. - -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 delivery +To enable message routing and provide additional context with each message between services, 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. + +For more information, read about [messaging with CloudEvents]({{< ref pubsub-cloudevents.md >}}), or [sending raw messages without CloudEvents]({{< ref pubsub-raw.md >}}). + +### 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`. + +- HTTP client: the content type can be set in a `Content-Type` header +- gRPC client and SDK: have a dedicated content type parameter + +### 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`). @@ -120,7 +76,7 @@ Dapr applications can subscribe to published topics via two methods that support | **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 >}}). +For more information, read [about the subscriptions in Subscription Methods]({{< ref subscription-methods.md >}}). ### Message routing From fa5b101ee0f2c28189e719b4cdb278fb276b73e7 Mon Sep 17 00:00:00 2001 From: Hannah Hunter Date: Thu, 19 May 2022 17:12:18 -0500 Subject: [PATCH 5/8] how to and overview updates Signed-off-by: Hannah Hunter --- .../pubsub/howto-publish-subscribe.md | 198 +++++++++--------- .../building-blocks/pubsub/pubsub-overview.md | 20 +- 2 files changed, 108 insertions(+), 110 deletions(-) diff --git a/daprdocs/content/en/developing-applications/building-blocks/pubsub/howto-publish-subscribe.md b/daprdocs/content/en/developing-applications/building-blocks/pubsub/howto-publish-subscribe.md index 1a5ef9435ca..63c7329f227 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/pubsub/howto-publish-subscribe.md +++ b/daprdocs/content/en/developing-applications/building-blocks/pubsub/howto-publish-subscribe.md @@ -1,29 +1,42 @@ --- type: docs -title: "Publish a message and subscribe to a topic" -linkTitle: "Publish & subscribe to topics" +title: "How to: Publish a message and subscribe to a topic" +linkTitle: "How to: Publish & subscribe to topics" weight: 2000 description: "Learn how to send messages to a topic with one service and subscribe to that topic in another service" --- Now that you've learned what the Dapr Pub/sub building block provides, learn how it can work in your service. The below code example loosely describes an application that processes orders with two services, each with Dapr sidecars: -- An order processing service using Dapr to publish a message to RabbitMQ. - A checkout service using Dapr to subscribe to the topic in the message queue. +- An order processing service using Dapr to publish a message to RabbitMQ. + Diagram showing state management of example service -## Setup the Pub/Sub component -The following example creates applications to publish and subscribe to a topic called `orders`. +Dapr automatically wraps the user payload in a CloudEvents v1.0 compliant envelope, using `Content-Type` header value for `datacontenttype` attribute. [Learn more about messages with CloudEvents.]({{< ref pubsub-cloudevents.md >}}) + +The following example demonstrates how your applications publish and subscribe to a topic called `orders`. + +{{% alert title="Note" color="primary" %}} + If you haven't already, [try out the new quickstart]({{< ref pubsub-quickstart.md >}}) for a quick walk-through on how to use Pub/Sub. + +{{% /alert %}} + + +## Set up the Pub/Sub component -The first step is to setup the Pub/Sub component: +The first step is to set up the Pub/Sub component: {{< tabs "Self-Hosted (CLI)" Kubernetes >}} {{% codetab %}} -The pubsub.yaml is created by default on your local machine when running `dapr init`. Verify by opening your components file under `%UserProfile%\.dapr\components\pubsub.yaml` on Windows or `~/.dapr/components/pubsub.yaml` on Linux/MacOS. +When you run `dapr init`, Dapr creates a default Redis `pubsub.yaml` and runs a Redis container on your local machine, located: -In this example, RabbitMQ is used for publish and subscribe. Replace `pubsub.yaml` file contents with the below contents. +- On Windows, under `%UserProfile%\.dapr\components\pubsub.yaml` +- On Linux/MacOS, under `~/.dapr/components/pubsub.yaml` + +With the `pubsub.yaml` component, you can easily swap out underlying components without application code changes. In this example, RabbitMQ is used. ```yaml apiVersion: dapr.io/v1alpha1 @@ -51,11 +64,55 @@ scopes: - checkout ``` -You can override this file with another Redis instance or another [pubsub component]({{< ref setup-pubsub >}}) by creating a `components` directory containing the file and using the flag `--components-path` with the `dapr run` CLI command. +You can override this file with another [pubsub component]({{< ref setup-pubsub >}}) by creating a components directory (in this example, `myComponents`) containing the file and using the flag `--components-path` with the `dapr run` CLI command. + +{{< tabs Dotnet Java Python Go Javascript >}} + +{{% codetab %}} + +```bash +dapr run --app-id myapp --components-path ./myComponents -- dotnet run +``` + {{% /codetab %}} {{% codetab %}} -To deploy this into a Kubernetes cluster, fill in the `metadata` connection details of your [desired pubsub component]({{< ref setup-pubsub >}}) in the yaml below, save as `pubsub.yaml`, and run `kubectl apply -f pubsub.yaml`. + +```bash +dapr run --app-id myapp --components-path ./myComponents -- mvn spring-boot:run +``` + +{{% /codetab %}} + +{{% codetab %}} + +```bash +dapr run --app-id myapp --components-path ./myComponents -- python3 app.py +``` + +{{% /codetab %}} + +{{% codetab %}} + +```bash +dapr run --app-id myapp --components-path ./myComponents -- go run app.go +``` + +{{% /codetab %}} + +{{% codetab %}} + +```bash +dapr run --app-id myapp --components-path ./myComponents -- npm start +``` +{{% /codetab %}} + +{{< /tabs >}} + +{{% /codetab %}} + +{{% codetab %}} +To deploy this into a Kubernetes cluster, fill in the `metadata` connection details of the [Pub/Sub component]({{< ref setup-pubsub >}}) in the YAML below, save as `pubsub.yaml`, and run `kubectl apply -f pubsub.yaml`. ```yaml apiVersion: dapr.io/v1alpha1 @@ -83,19 +140,19 @@ scopes: - orderprocessing - checkout ``` + {{% /codetab %}} {{< /tabs >}} - -## Step 2: Subscribe to topics +## Subscribe to topics Dapr allows two methods by which you can subscribe to topics: - **Declaratively**, where subscriptions are defined in an external file. - **Programmatically**, where subscriptions are defined in user code. -Learn more in the [declarative and programmatic subscriptions doc]({{< ref subscription-methods.md >}}). This example will demonstrate a declarative subscription. +Learn more in the [declarative and programmatic subscriptions doc]({{< ref subscription-methods.md >}}). This example will demonstrate a **declarative** subscription. Create a file named `subscription.yaml` and paste the following: @@ -114,69 +171,13 @@ scopes: ``` The example above shows an event subscription to topic `orders`, for the pubsub component `order-pub-sub`. + - The `route` field tells Dapr to send all topic messages to the `/checkout` endpoint in the app. - The `scopes` field enables this subscription for apps with IDs `orderprocessing` and `checkout`. -Set the component with: - -Place the CRD in your `./components` directory. When Dapr starts up, it loads subscriptions along with components. - -Note: By default, Dapr loads components from `$HOME/.dapr/components` on MacOS/Linux and `%USERPROFILE%\.dapr\components` on Windows. - -You can also override the default directory by pointing the Dapr CLI to a components path: - -{{< tabs Dotnet Java Python Go Javascript Kubernetes>}} - -{{% codetab %}} - -```bash -dapr run --app-id myapp --components-path ./myComponents -- dotnet run -``` - -{{% /codetab %}} - -{{% codetab %}} - -```bash -dapr run --app-id myapp --components-path ./myComponents -- mvn spring-boot:run -``` - -{{% /codetab %}} - -{{% codetab %}} +Place `subscription.yaml` in the same directory as your `pubsub.yaml` component. When Dapr starts up, it loads subscriptions along with the components. -```bash -dapr run --app-id myapp --components-path ./myComponents -- python3 app.py -``` - -{{% /codetab %}} - -{{% codetab %}} - -```bash -dapr run --app-id myapp --components-path ./myComponents -- go run app.go -``` - -{{% /codetab %}} - -{{% codetab %}} - -```bash -dapr run --app-id myapp --components-path ./myComponents -- npm start -``` - -{{% /codetab %}} - -{{% codetab %}} -In Kubernetes, save the CRD to a file and apply it to the cluster: -```bash -kubectl apply -f subscription.yaml -``` -{{% /codetab %}} - -{{< /tabs >}} - -Below are code examples that leverage Dapr SDKs to subscribe to a topic. +Below are code examples that leverage Dapr SDKs to subscribe to the topic you defined in `subscription.yaml`. {{< tabs Dotnet Java Python Go Javascript>}} @@ -208,7 +209,7 @@ namespace CheckoutService.controller } ``` -Navigate to the directory containing the above code, then run the following command to launch a Dapr sidecar and run the application: +Navigate to the directory containing the above code, then run the following command to launch both a Dapr sidecar and the subscriber application: ```bash dapr run --app-id checkout --app-port 6002 --dapr-http-port 3602 --dapr-grpc-port 60002 --app-ssl dotnet run @@ -248,7 +249,7 @@ public class CheckoutServiceController { } ``` -Navigate to the directory containing the above code, then run the following command to launch a Dapr sidecar and run the application: +Navigate to the directory containing the above code, then run the following command to launch both a Dapr sidecar and the subscriber application: ```bash dapr run --app-id checkout --app-port 6002 --dapr-http-port 3602 --dapr-grpc-port 60002 mvn spring-boot:run @@ -277,7 +278,7 @@ def mytopic(event: v1.Event) -> None: app.run(6002) ``` -Navigate to the directory containing the above code, then run the following command to launch a Dapr sidecar and run the application: +Navigate to the directory containing the above code, then run the following command to launch both a Dapr sidecar and the subscriber application: ```bash dapr run --app-id checkout --app-port 6002 --dapr-http-port 3602 --app-protocol grpc -- python3 CheckoutService.py @@ -322,7 +323,7 @@ func eventHandler(ctx context.Context, e *common.TopicEvent) (retry bool, err er } ``` -Navigate to the directory containing the above code, then run the following command to launch a Dapr sidecar and run the application: +Navigate to the directory containing the above code, then run the following command to launch both a Dapr sidecar and the subscriber application: ```bash dapr run --app-id checkout --app-port 6002 --dapr-http-port 3602 --dapr-grpc-port 60002 go run CheckoutService.go @@ -362,7 +363,7 @@ async function start(orderId) { } ``` -Navigate to the directory containing the above code, then run the following command to launch a Dapr sidecar and run the application: +Navigate to the directory containing the above code, then run the following command to launch both a Dapr sidecar and the subscriber application: ```bash dapr run --app-id checkout --app-port 6002 --dapr-http-port 3602 --dapr-grpc-port 60002 npm start @@ -372,44 +373,44 @@ dapr run --app-id checkout --app-port 6002 --dapr-http-port 3602 --dapr-grpc-por {{< /tabs >}} -The `/checkout` endpoint matches the `route` defined in the subscriptions and this is where Dapr will send all topic messages to. - -## Step 3: Publish a topic +## Publish a message Start an instance of Dapr with an app-id called `orderprocessing`: ```bash dapr run --app-id orderprocessing --dapr-http-port 3601 ``` + +Then publish a message to the `orders` topic: + {{< tabs "Dapr CLI" "HTTP API (Bash)" "HTTP API (PowerShell)">}} {{% codetab %}} -Then publish a message to the `orders` topic: - ```bash dapr publish --publish-app-id orderprocessing --pubsub order-pub-sub --topic orders --data '{"orderId": "100"}' ``` + {{% /codetab %}} {{% codetab %}} -Then publish a message to the `orders` topic: + ```bash curl -X POST http://localhost:3601/v1.0/publish/order-pub-sub/orders -H "Content-Type: application/json" -d '{"orderId": "100"}' ``` + {{% /codetab %}} {{% codetab %}} -Then publish a message to the `orders` topic: + ```powershell Invoke-RestMethod -Method Post -ContentType 'application/json' -Body '{"orderId": "100"}' -Uri 'http://localhost:3601/v1.0/publish/order-pub-sub/orders' ``` + {{% /codetab %}} {{< /tabs >}} -Dapr automatically wraps the user payload in a Cloud Events v1.0 compliant envelope, using `Content-Type` header value for `datacontenttype` attribute. - Below are code examples that leverage Dapr SDKs to publish a topic. {{< tabs Dotnet Java Python Go Javascript>}} @@ -452,7 +453,7 @@ namespace EventService } ``` -Navigate to the directory containing the above code, then run the following command to launch a Dapr sidecar and run the application: +Navigate to the directory containing the above code, then run the following command to launch both a Dapr sidecar and the publisher application: ```bash dapr run --app-id orderprocessing --app-port 6001 --dapr-http-port 3601 --dapr-grpc-port 60001 --app-ssl dotnet run @@ -502,7 +503,7 @@ public class OrderProcessingServiceApplication { } ``` -Navigate to the directory containing the above code, then run the following command to launch a Dapr sidecar and run the application: +Navigate to the directory containing the above code, then run the following command to launch both a Dapr sidecar and the publisher application: ```bash dapr run --app-id orderprocessing --app-port 6001 --dapr-http-port 3601 --dapr-grpc-port 60001 mvn spring-boot:run @@ -539,7 +540,7 @@ while True: logging.info('Published data: ' + str(orderId)) ``` -Navigate to the directory containing the above code, then run the following command to launch a Dapr sidecar and run the application: +Navigate to the directory containing the above code, then run the following command to launch both a Dapr sidecar and the publisher application: ```bash dapr run --app-id orderprocessing --app-port 6001 --dapr-http-port 3601 --app-protocol grpc python3 OrderProcessingService.py @@ -587,7 +588,7 @@ func main() { } ``` -Navigate to the directory containing the above code, then run the following command to launch a Dapr sidecar and run the application: +Navigate to the directory containing the above code, then run the following command to launch both a Dapr sidecar and the publisher application: ```bash dapr run --app-id orderprocessing --app-port 6001 --dapr-http-port 3601 --dapr-grpc-port 60001 go run OrderProcessingService.go @@ -630,7 +631,7 @@ function sleep(ms) { main(); ``` -Navigate to the directory containing the above code, then run the following command to launch a Dapr sidecar and run the application: +Navigate to the directory containing the above code, then run the following command to launch both a Dapr sidecar and the publisher application: ```bash dapr run --app-id orderprocessing --app-port 6001 --dapr-http-port 3601 --dapr-grpc-port 60001 npm start @@ -640,18 +641,13 @@ dapr run --app-id orderprocessing --app-port 6001 --dapr-http-port 3601 --dapr-g {{< /tabs >}} - -## Step 4: ACK-ing a message +## ACK message In order to tell Dapr that a message was processed successfully, return a `200 OK` response. If Dapr receives any other return status code than `200`, or if your app crashes, Dapr will attempt to redeliver the message following at-least-once semantics. - ## Next steps -- Try the [Pub/Sub quickstart sample](https://github.com/dapr/quickstarts/tree/master/tutorials/pub-sub) -- Learn about [PubSub routing]({{< ref howto-route-messages >}}) -- Learn about [topic scoping]({{< ref pubsub-scopes.md >}}) -- Learn about [message time-to-live]({{< ref pubsub-message-ttl.md >}}) -- Learn [how to configure Pub/Sub components with multiple namespaces]({{< ref pubsub-namespaces.md >}}) -- List of [pub/sub components]({{< ref setup-pubsub >}}) -- Read the [API reference]({{< ref pubsub_api.md >}}) +- Try the [Pub/Sub tutorial]({{https://github.com/dapr/quickstarts/tree/master/tutorials/pub-sub}}). +- Learn about [messaging with CloudEvents]({{< ref pubsub-cloudevents.md >}}) and when you might want to [send messages without CloudEvents]({{< ref pubsub-raw.md >}}). +- Review the list of [pub/sub components]({{< ref setup-pubsub >}}). +- Read the [API reference]({{< ref pubsub_api.md >}}). 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 5d53ba752a0..6a5393c7e49 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 @@ -120,7 +120,9 @@ If one of your applications uses Dapr while another doesn't, you can disable the For more information, read [how to use Pub/Sub without CloudEvents]({{< ref pubsub-raw.md >}}). -## Try it out +## Try out Pub/Sub + +### Quickstarts and tutorials Want to put the Dapr Pub/Sub API to the test? Walk through the following quickstart and tutorials to see Pub/Sub in action: @@ -129,13 +131,13 @@ Want to put the Dapr Pub/Sub API to the test? Walk through the following quickst | [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 +### Start using Pub/Sub directly in your app -* 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 more about [Pub/Sub with and 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 >}}) +Want to skip the quickstarts? Not a problem. You can try out the Pub/Sub building block directly in your application to publish messages and subscribe to a topic. After [Dapr is installed]({{< ref "getting-started/_index.md" >}}), you can begin using the Pub/Sub API starting with [the Pub/Sub how-to guide]({{< ref howto-publish-subscribe.md >}}). + +## Next steps +- Learn about [messaging with CloudEvents]({{< ref pubsub-cloudevents.md >}}) and when you might want to [send messages without CloudEvents]({{< ref pubsub-raw.md >}}). +- Follow [How-To: Configure Pub/Sub components with multiple namespaces]({{< ref pubsub-namespaces.md >}}). +- Review the list of [pub/sub components]({{< ref setup-pubsub >}}). +- Read the [API reference]({{< ref pubsub_api.md >}}). From b8dd756397bc5bd09ad78ad95c10d8c64f5f26c5 Mon Sep 17 00:00:00 2001 From: Hannah Hunter Date: Mon, 23 May 2022 14:32:01 -0500 Subject: [PATCH 6/8] grammar pass before opening for review Signed-off-by: Hannah Hunter --- .../pubsub/howto-route-messages.md | 261 ++++++++---------- 1 file changed, 111 insertions(+), 150 deletions(-) diff --git a/daprdocs/content/en/developing-applications/building-blocks/pubsub/howto-route-messages.md b/daprdocs/content/en/developing-applications/building-blocks/pubsub/howto-route-messages.md index bb7aa7bbd95..9980f2808c2 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/pubsub/howto-route-messages.md +++ b/daprdocs/content/en/developing-applications/building-blocks/pubsub/howto-route-messages.md @@ -10,15 +10,15 @@ description: "Learn how to route messages from a topic to different event handle Pub/Sub message routing is currently in [preview]({{< ref preview-features.md >}}). {{% /alert %}} -## Introduction +Pub/Sub routing is an implementation of [content-based routing](https://www.enterpriseintegrationpatterns.com/ContentBasedRouter.html), a messaging pattern that utilizes a DSL instead of imperative application code. With Pub/Sub routing, you 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, then an optional default route is used. This proves useful as your applications expand to support multiple event versions or special cases. -[Content-based routing](https://www.enterpriseintegrationpatterns.com/ContentBasedRouter.html) is a messaging pattern that utilizes a DSL instead of imperative application code. PubSub routing 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, then an optional default route is used. This becomes useful as your applications expands to support multiple event versions, or special cases. Routing can be implemented with code; however, keeping routing rules external from the application can improve portability. +While routing can be implemented with code, keeping routing rules external from the application can improve portability. -This feature is available to both the declarative and programmatic subscription approaches. +This feature is available to both the [declarative and programmatic subscription approaches]({{< ref subscription-methods.md >}}). ## Enable message routing -This is a preview feature. To enable it, add the `PubSub.Routing` feature entry to your application configuration like so: +To enable this preview feature, add the `PubSub.Routing` feature entry to your application configuration: ```yaml apiVersion: dapr.io/v1alpha1 @@ -30,10 +30,12 @@ spec: - name: PubSub.Routing enabled: true ``` -Learn more about enabling [preview features]({{}}). + +Learn more about enabling [preview features]({{< ref preview-features >}}). + ## Declarative subscription -For declarative subscriptions, you must use `dapr.io/v2alpha1` as the `apiVersion`. Here is an example of `subscriptions.yaml` using routing. +For declarative subscriptions, use `dapr.io/v2alpha1` as the `apiVersion`. Here is an example of `subscriptions.yaml` using routing: ```yaml apiVersion: dapr.io/v2alpha1 @@ -57,7 +59,7 @@ scopes: ## Programmatic subscription -Alternatively, the programattic approach varies slightly in that the `routes` structure is returned instead of `route`. The JSON structure matches the declarative YAML. +In the programmatic approach, the `routes` structure is returned instead of `route`. The JSON structure matches the declarative YAML: {{< tabs Python Node "C#" Go PHP>}} @@ -268,27 +270,34 @@ $app->start(); ## Common Expression Language (CEL) -In these examples, depending on the type of the event (`event.type`), the application will be called on `/widgets`, `/gadgets` or `/products`. The expressions are written as [Common Expression Language (CEL)](https://github.com/google/cel-spec) where `event` represents the cloud event. Any of the attributes from the [CloudEvents core specification](https://github.com/cloudevents/spec/blob/v1.0.1/spec.md#required-attributes) can be referenced in the expression. +In these examples, depending on the `event.type`, the application will be called on: + +- `/widgets` +- `/gadgets` +- `/products` + +The expressions are written as [Common Expression Language (CEL)](https://github.com/google/cel-spec) where `event` represents the cloud event. Any of the attributes from the [CloudEvents core specification](https://github.com/cloudevents/spec/blob/v1.0.1/spec.md#required-attributes) can be referenced in the expression. ### Example expressions -Match "important" messages +Match "important" messages: ```javascript has(event.data.important) && event.data.important == true ``` -Match deposits greater than $10000 +Match deposits greater than $10,000: ```javascript event.type == "deposit" && event.data.amount > 10000 ``` -Match multiple versions of a message +Match multiple versions of a message: ```javascript event.type == "mymessage.v1" ``` + ```javascript event.type == "mymessage.v2" ``` @@ -301,201 +310,154 @@ For reference, the following attributes are from the CloudEvents specification. #### data -As defined by the term Data, CloudEvents MAY include domain-specific information about the occurrence. When present, this information will be encapsulated within `data`. +As defined by the term **data**, CloudEvents _may_ include domain-specific information about the occurrence. When present, this information will be encapsulated within `data`. -- Description: The event payload. This specification does not place any restriction on the type of this information. It is encoded into a media format which is specified by the `datacontenttype` attribute (e.g. application/json), and adheres to the `dataschema` format when those respective attributes are present. -- Constraints: +- **Description:** The event payload. This specification places no restriction on the information type. It is encoded into a media format, specified by the `datacontenttype` attribute (e.g. application/json), and adheres to the `dataschema` format when those respective attributes are present. +- **Constraints:** - OPTIONAL {{% alert title="Limitation" color="warning" %}} -Currently, it is only possible to access the attributes inside data if it is nested JSON values and not JSON escaped in a string. +Currently, you can only access the attributes inside data if it is nested JSON values and not JSON escaped in a string. {{% /alert %}} ### REQUIRED Attributes -The following attributes are REQUIRED to be present in all CloudEvents: +The following attributes are **required** in all CloudEvents: #### id -- Type: `String` -- Description: Identifies the event. Producers MUST ensure that `source` + `id` - is unique for each distinct event. If a duplicate event is re-sent (e.g. due - to a network error) it MAY have the same `id`. Consumers MAY assume that - Events with identical `source` and `id` are duplicates. -- Constraints: +- **Type:** `String` +- **Description:** Identifies the event. Producers _must_ ensure that `source` + `id` + are unique for each distinct event. If a duplicate event is re-sent (e.g. due + to a network error), it may have the same `id`. Consumers may assume that + events with identical `source` and `id` are duplicates. +- **Constraints:** - REQUIRED - - MUST be a non-empty string - - MUST be unique within the scope of the producer -- Examples: + - Must be a non-empty string + - Must be unique within the scope of the producer +- **Examples:** - An event counter maintained by the producer - A UUID #### source -- Type: `URI-reference` -- Description: Identifies the context in which an event happened. Often this - will include information such as the type of the event source, the - organization publishing the event or the process that produced the event. The - exact syntax and semantics behind the data encoded in the URI is defined by - the event producer. +- **Type:** `URI-reference` +- **Description:** Identifies the context in which an event happened. Often this includes information such as: + - The type of the event source + - The organization publishing the event + - The process that produced the event + + The exact syntax and semantics behind the data encoded in the URI is defined by the event producer. - Producers MUST ensure that `source` + `id` is unique for each distinct event. + Producers _must_ ensure that `source` + `id` are unique for each distinct event. - An application MAY assign a unique `source` to each distinct producer, which - makes it easy to produce unique IDs since no other producer will have the same - source. The application MAY use UUIDs, URNs, DNS authorities or an - application-specific scheme to create unique `source` identifiers. + An application may: + - Assign a unique `source` to each distinct producer, making it easier to produce unique IDs and preventing other producers from having the same `source`. + - Use UUIDs, URNs, DNS authorities, or an application-specific scheme to create unique `source` identifiers. - A source MAY include more than one producer. In that case the producers MUST - collaborate to ensure that `source` + `id` is unique for each distinct event. + A source may include more than one producer. In this case, the producers _must_ collaborate to ensure that `source` + `id` are unique for each distinct event. -- Constraints: +- **Constraints:** - REQUIRED - - MUST be a non-empty URI-reference + - Must be a non-empty URI-reference - An absolute URI is RECOMMENDED -- Examples - - Internet-wide unique URI with a DNS authority. +- **Examples:** + - Internet-wide unique URI with a DNS authority: - https://github.com/cloudevents - mailto:cncf-wg-serverless@lists.cncf.io - Universally-unique URN with a UUID: - urn:uuid:6e8bc430-9c3a-11d9-9669-0800200c9a66 - - Application-specific identifiers + - Application-specific identifiers: - /cloudevents/spec/pull/123 - /sensors/tn-1234567/alerts - 1-555-123-4567 #### specversion -- Type: `String` -- Description: The version of the CloudEvents specification which the event - uses. This enables the interpretation of the context. Compliant event - producers MUST use a value of `1.0` when referring to this version of the - specification. +- **Type:** `String` +- **Description:** The version of the CloudEvents specification used by the event. This enables the interpretation of the context. Compliant event producers _must_ use a value of `1.0` when referring to this version of the specification. + + Currently, this attribute only includes the 'major' and 'minor' version numbers. This allows patch changes to the specification to be made without changing this property's value in the serialization. - Currently, this attribute will only have the 'major' and 'minor' version - numbers included in it. This allows for 'patch' changes to the specification - to be made without changing this property's value in the serialization. - Note: for 'release candidate' releases a suffix might be used for testing + Note: for 'release candidate' releases, a suffix might be used for testing purposes. -- Constraints: +- **Constraints:** - REQUIRED - - MUST be a non-empty string + - Must be a non-empty string #### type -- Type: `String` -- Description: This attribute contains a value describing the type of event - related to the originating occurrence. Often this attribute is used for - routing, observability, policy enforcement, etc. The format of this is - producer defined and might include information such as the version of the - `type` - see - [Versioning of CloudEvents in the Primer](https://github.com/cloudevents/spec/blob/v1.0.1/primer.md#versioning-of-cloudevents) - for more information. -- Constraints: +- **Type:** `String` +- **Description:** Contains a value describing the event type related to the originating occurrence. Often, this attribute is used for routing, observability, policy enforcement, etc. The format is producer-defined and might include information like the version of the `type`. See [Versioning of CloudEvents in the Primer](https://github.com/cloudevents/spec/blob/v1.0.1/primer.md#versioning-of-cloudevents) for more information. +- **Constraints:** - REQUIRED - - MUST be a non-empty string - - SHOULD be prefixed with a reverse-DNS name. The prefixed domain dictates the - organization which defines the semantics of this event type. -- Examples + - Must be a non-empty string + - Should be prefixed with a reverse-DNS name. The prefixed domain dictates the + organization, which defines the semantics of this event type. +- **Examples:** - com.github.pull_request.opened - com.example.object.deleted.v2 ### OPTIONAL Attributes -The following attributes are OPTIONAL to appear in CloudEvents. See the -[Notational Conventions](https://github.com/cloudevents/spec/blob/v1.0.1/spec.md#notational-conventions) section for more information -on the definition of OPTIONAL. +The following attributes are **optional** to appear in CloudEvents. See the [Notational Conventions](https://github.com/cloudevents/spec/blob/v1.0.1/spec.md#notational-conventions) section for more information on the definition of OPTIONAL. #### datacontenttype -- Type: `String` per [RFC 2046](https://tools.ietf.org/html/rfc2046) -- Description: Content type of `data` value. This attribute enables `data` to - carry any type of content, whereby format and encoding might differ from that - of the chosen event format. For example, an event rendered using the - [JSON envelope](https://github.com/cloudevents/spec/blob/v1.0.1/json-format.md#3-envelope) format might carry an XML payload - in `data`, and the consumer is informed by this attribute being set to - "application/xml". The rules for how `data` content is rendered for different - `datacontenttype` values are defined in the event format specifications; for - example, the JSON event format defines the relationship in - [section 3.1](https://github.com/cloudevents/spec/blob/v1.0.1/json-format.md#31-handling-of-data). - - For some binary mode protocol bindings, this field is directly mapped to the - respective protocol's content-type metadata property. Normative rules for the - binary mode and the content-type metadata mapping can be found in the - respective protocol. - - In some event formats the `datacontenttype` attribute MAY be omitted. For - example, if a JSON format event has no `datacontenttype` attribute, then it is - implied that the `data` is a JSON value conforming to the "application/json" - media type. In other words: a JSON-format event with no `datacontenttype` is - exactly equivalent to one with `datacontenttype="application/json"`. - - When translating an event message with no `datacontenttype` attribute to a - different format or protocol binding, the target `datacontenttype` SHOULD be - set explicitly to the implied `datacontenttype` of the source. - -- Constraints: +- **Type:** `String` per [RFC 2046](https://tools.ietf.org/html/rfc2046) +- **Description:** Content type of `data` value. This attribute enables `data` to carry any type of content, whereby format and encoding might differ from that of the chosen event format. + + For example, an event rendered using the [JSON envelope](https://github.com/cloudevents/spec/blob/v1.0.1/json-format.md#3-envelope) format might carry an XML payload in `data`. The consumer is informed by this attribute being set to `"application/xml"`. + + The rules for how `data` content is rendered for different `datacontenttype` values are defined in the event format specifications. For example, the JSON event format defines the relationship in [section 3.1](https://github.com/cloudevents/spec/blob/v1.0.1/json-format.md#31-handling-of-data). + + For some binary mode protocol bindings, this field is directly mapped to the respective protocol's content-type metadata property. You can find normative rules for the binary mode and the content-type metadata mapping in the respective protocol. + + In some event formats, you may omit the `datacontenttype` attribute. For example, if a JSON format event has no `datacontenttype` attribute, it's implied that the `data` is a JSON value conforming to the `"application/json"` media type. In other words: a JSON-format event with no `datacontenttype` is exactly equivalent to one with `datacontenttype="application/json"`. + + When translating an event message with no `datacontenttype` attribute to a different format or protocol binding, the target `datacontenttype` should be set explicitly to the implied `datacontenttype` of the source. + +- **Constraints:** - OPTIONAL - - If present, MUST adhere to the format specified in - [RFC 2046](https://tools.ietf.org/html/rfc2046) -- For Media Type examples see - [IANA Media Types](http://www.iana.org/assignments/media-types/media-types.xhtml) + - If present, must adhere to the format specified in [RFC 2046](https://tools.ietf.org/html/rfc2046) +- For Media Type examples, see [IANA Media Types](http://www.iana.org/assignments/media-types/media-types.xhtml) #### dataschema -- Type: `URI` -- Description: Identifies the schema that `data` adheres to. Incompatible - changes to the schema SHOULD be reflected by a different URI. See - [Versioning of CloudEvents in the Primer](https://github.com/cloudevents/spec/blob/v1.0.1/primer.md#versioning-of-cloudevents) - for more information. -- Constraints: +- **Type:** `URI` +- **Description:** Identifies the schema that `data` adheres to. Incompatible changes to the schema should be reflected by a different URI. See [Versioning of CloudEvents in the Primer](https://github.com/cloudevents/spec/blob/v1.0.1/primer.md#versioning-of-cloudevents) for more information. +- **Constraints:** - OPTIONAL - - If present, MUST be a non-empty URI + - If present, must be a non-empty URI #### subject -- Type: `String` -- Description: This describes the subject of the event in the context of the - event producer (identified by `source`). In publish-subscribe scenarios, a - subscriber will typically subscribe to events emitted by a `source`, but the - `source` identifier alone might not be sufficient as a qualifier for any - specific event if the `source` context has internal sub-structure. - - Identifying the subject of the event in context metadata (opposed to only in - the `data` payload) is particularly helpful in generic subscription filtering - scenarios where middleware is unable to interpret the `data` content. In the - above example, the subscriber might only be interested in blobs with names - ending with '.jpg' or '.jpeg' and the `subject` attribute allows for - constructing a simple and efficient string-suffix filter for that subset of - events. - -- Constraints: +- **Type:** `String` +- **Description:** This describes the event subject in the context of the event producer (identified by `source`). In publish-subscribe scenarios, a subscriber will typically subscribe to events emitted by a `source`. The `source` identifier alone might not be sufficient as a qualifier for any specific event if the `source` context has internal sub-structure. + + Identifying the subject of the event in context metadata (opposed to only in the `data` payload) is helpful in generic subscription filtering scenarios, where middleware is unable to interpret the `data` content. In the above example, the subscriber might only be interested in blobs with names ending with '.jpg' or '.jpeg'. With the `subject` attribute, you can construct a simple and efficient string-suffix filter for that subset of events. + +- **Constraints:** - OPTIONAL - - If present, MUST be a non-empty string -- Example: - - A subscriber might register interest for when new blobs are created inside a - blob-storage container. In this case, the event `source` identifies the - subscription scope (storage container), the `type` identifies the "blob - created" event, and the `id` uniquely identifies the event instance to - distinguish separate occurrences of a same-named blob having been created; - the name of the newly created blob is carried in `subject`: - - `source`: https://example.com/storage/tenant/container - - `subject`: mynewfile.jpg + - If present, must be a non-empty string +- **Example:** + A subscriber might register interest for when new blobs are created inside a blob-storage container. In this case: + - The event `source` identifies the subscription scope (storage container) + - The event `type` identifies the "blob created" event + - The event `id` uniquely identifies the event instance to distinguish separately created occurrences of a same-named blob. + + The name of the newly created blob is carried in `subject`: + - `source`: https://example.com/storage/tenant/container + - `subject`: mynewfile.jpg #### time -- Type: `Timestamp` -- Description: Timestamp of when the occurrence happened. If the time of the - occurrence cannot be determined then this attribute MAY be set to some other - time (such as the current time) by the CloudEvents producer, however all - producers for the same `source` MUST be consistent in this respect. In other - words, either they all use the actual time of the occurrence or they all use - the same algorithm to determine the value used. -- Constraints: +- **Type:** `Timestamp` +- **Description:** Timestamp of when the occurrence happened. If the time of the occurrence cannot be determined, then this attribute may be set to some other time (such as the current time) by the CloudEvents producer. However, all producers for the same `source` _must_ be consistent in this respect. In other words, either they all use the actual time of the occurrence or they all use the same algorithm to determine the value used. +- **Constraints:** - OPTIONAL - - If present, MUST adhere to the format specified in - [RFC 3339](https://tools.ietf.org/html/rfc3339) + - If present, must adhere to the format specified in [RFC 3339](https://tools.ietf.org/html/rfc3339) {{% alert title="Limitation" color="warning" %}} Currently, comparisons to time (e.g. before or after "now") are not supported. @@ -511,9 +473,8 @@ Watch [this video](https://www.youtube.com/watch?v=QqJgRmbH82I&t=1063s) on how t ## Next steps -- Try the [Pub/Sub routing sample](https://github.com/dapr/samples/tree/master/pub-sub-routing) -- Learn about [topic scoping]({{< ref pubsub-scopes.md >}}) -- Learn about [message time-to-live]({{< ref pubsub-message-ttl.md >}}) -- Learn [how to configure Pub/Sub components with multiple namespaces]({{< ref pubsub-namespaces.md >}}) -- List of [pub/sub components]({{< ref setup-pubsub >}}) -- Read the [API reference]({{< ref pubsub_api.md >}}) +- Try the [Pub/Sub routing sample](https://github.com/dapr/samples/tree/master/pub-sub-routing). +- Learn about [topic scoping]({{< ref pubsub-scopes.md >}}) and [message time-to-live]({{< ref pubsub-message-ttl.md >}}). +- [Configure Pub/Sub components with multiple namespaces]({{< ref pubsub-namespaces.md >}}). +- Review the list of [pub/sub components]({{< ref setup-pubsub >}}). +- Read the [API reference]({{< ref pubsub_api.md >}}). From ee772e72d9e8b429b5f7f6fbf1fa3c653b6a6fd1 Mon Sep 17 00:00:00 2001 From: Hannah Hunter Date: Thu, 26 May 2022 09:39:54 -0500 Subject: [PATCH 7/8] updates from Mark Signed-off-by: Hannah Hunter --- .../pubsub/howto-publish-subscribe.md | 17 ++--- .../pubsub/howto-route-messages.md | 8 +- .../pubsub/pubsub-cloudevents.md | 8 +- .../pubsub/pubsub-message-ttl.md | 9 ++- .../building-blocks/pubsub/pubsub-overview.md | 73 +++++++++---------- .../building-blocks/pubsub/pubsub-raw.md | 9 +-- .../building-blocks/pubsub/pubsub-scopes.md | 6 +- .../pubsub/subscription-methods.md | 16 ++-- .../content/en/reference/api/pubsub_api.md | 2 +- 9 files changed, 71 insertions(+), 77 deletions(-) diff --git a/daprdocs/content/en/developing-applications/building-blocks/pubsub/howto-publish-subscribe.md b/daprdocs/content/en/developing-applications/building-blocks/pubsub/howto-publish-subscribe.md index 63c7329f227..c11534932d0 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/pubsub/howto-publish-subscribe.md +++ b/daprdocs/content/en/developing-applications/building-blocks/pubsub/howto-publish-subscribe.md @@ -6,7 +6,7 @@ weight: 2000 description: "Learn how to send messages to a topic with one service and subscribe to that topic in another service" --- -Now that you've learned what the Dapr Pub/sub building block provides, learn how it can work in your service. The below code example loosely describes an application that processes orders with two services, each with Dapr sidecars: +Now that you've learned what the Dapr pub/sub building block provides, learn how it can work in your service. The below code example loosely describes an application that processes orders with two services, each with Dapr sidecars: - A checkout service using Dapr to subscribe to the topic in the message queue. - An order processing service using Dapr to publish a message to RabbitMQ. @@ -19,14 +19,13 @@ Dapr automatically wraps the user payload in a CloudEvents v1.0 compliant envelo The following example demonstrates how your applications publish and subscribe to a topic called `orders`. {{% alert title="Note" color="primary" %}} - If you haven't already, [try out the new quickstart]({{< ref pubsub-quickstart.md >}}) for a quick walk-through on how to use Pub/Sub. + If you haven't already, [try out the pub/sub quickstart]({{< ref pubsub-quickstart.md >}}) for a quick walk-through on how to use pub/sub. {{% /alert %}} - ## Set up the Pub/Sub component -The first step is to set up the Pub/Sub component: +The first step is to set up the pub/sub component: {{< tabs "Self-Hosted (CLI)" Kubernetes >}} @@ -112,7 +111,7 @@ dapr run --app-id myapp --components-path ./myComponents -- npm start {{% /codetab %}} {{% codetab %}} -To deploy this into a Kubernetes cluster, fill in the `metadata` connection details of the [Pub/Sub component]({{< ref setup-pubsub >}}) in the YAML below, save as `pubsub.yaml`, and run `kubectl apply -f pubsub.yaml`. +To deploy this into a Kubernetes cluster, fill in the `metadata` connection details of the [pub/sub component]({{< ref setup-pubsub >}}) in the YAML below, save as `pubsub.yaml`, and run `kubectl apply -f pubsub.yaml`. ```yaml apiVersion: dapr.io/v1alpha1 @@ -147,12 +146,12 @@ scopes: ## Subscribe to topics -Dapr allows two methods by which you can subscribe to topics: +Dapr provides two methods by which you can subscribe to topics: - **Declaratively**, where subscriptions are defined in an external file. - **Programmatically**, where subscriptions are defined in user code. -Learn more in the [declarative and programmatic subscriptions doc]({{< ref subscription-methods.md >}}). This example will demonstrate a **declarative** subscription. +Learn more in the [declarative and programmatic subscriptions doc]({{< ref subscription-methods.md >}}). This example demonstrates a **declarative** subscription. Create a file named `subscription.yaml` and paste the following: @@ -641,13 +640,13 @@ dapr run --app-id orderprocessing --app-port 6001 --dapr-http-port 3601 --dapr-g {{< /tabs >}} -## ACK message +## Message acknowledgement and retries In order to tell Dapr that a message was processed successfully, return a `200 OK` response. If Dapr receives any other return status code than `200`, or if your app crashes, Dapr will attempt to redeliver the message following at-least-once semantics. ## Next steps -- Try the [Pub/Sub tutorial]({{https://github.com/dapr/quickstarts/tree/master/tutorials/pub-sub}}). +- Try the [pub/sub tutorial]({{https://github.com/dapr/quickstarts/tree/master/tutorials/pub-sub}}). - Learn about [messaging with CloudEvents]({{< ref pubsub-cloudevents.md >}}) and when you might want to [send messages without CloudEvents]({{< ref pubsub-raw.md >}}). - Review the list of [pub/sub components]({{< ref setup-pubsub >}}). - Read the [API reference]({{< ref pubsub_api.md >}}). diff --git a/daprdocs/content/en/developing-applications/building-blocks/pubsub/howto-route-messages.md b/daprdocs/content/en/developing-applications/building-blocks/pubsub/howto-route-messages.md index 9980f2808c2..be9c37f7966 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/pubsub/howto-route-messages.md +++ b/daprdocs/content/en/developing-applications/building-blocks/pubsub/howto-route-messages.md @@ -7,10 +7,10 @@ description: "Learn how to route messages from a topic to different event handle --- {{% alert title="Preview feature" color="warning" %}} -Pub/Sub message routing is currently in [preview]({{< ref preview-features.md >}}). +Pub/sub message routing is currently in [preview]({{< ref preview-features.md >}}). {{% /alert %}} -Pub/Sub routing is an implementation of [content-based routing](https://www.enterpriseintegrationpatterns.com/ContentBasedRouter.html), a messaging pattern that utilizes a DSL instead of imperative application code. With Pub/Sub routing, you 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, then an optional default route is used. This proves useful as your applications expand to support multiple event versions or special cases. +Pub/sub routing is an implementation of [content-based routing](https://www.enterpriseintegrationpatterns.com/ContentBasedRouter.html), a messaging pattern that utilizes a DSL instead of imperative application code. With pub/sub routing, you 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, then an optional default route is used. This proves useful as your applications expand to support multiple event versions or special cases. While routing can be implemented with code, keeping routing rules external from the application can improve portability. @@ -473,8 +473,8 @@ Watch [this video](https://www.youtube.com/watch?v=QqJgRmbH82I&t=1063s) on how t ## Next steps -- Try the [Pub/Sub routing sample](https://github.com/dapr/samples/tree/master/pub-sub-routing). +- Try the [pub/sub routing sample](https://github.com/dapr/samples/tree/master/pub-sub-routing). - Learn about [topic scoping]({{< ref pubsub-scopes.md >}}) and [message time-to-live]({{< ref pubsub-message-ttl.md >}}). -- [Configure Pub/Sub components with multiple namespaces]({{< ref pubsub-namespaces.md >}}). +- [Configure pub/sub components with multiple namespaces]({{< ref pubsub-namespaces.md >}}). - Review the list of [pub/sub components]({{< ref setup-pubsub >}}). - Read the [API reference]({{< ref pubsub_api.md >}}). diff --git a/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-cloudevents.md b/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-cloudevents.md index a07de96be54..e2ab04d5709 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-cloudevents.md +++ b/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-cloudevents.md @@ -3,7 +3,7 @@ type: docs title: "Publishing & subscribing messages with Cloudevents" linkTitle: "Messages with Cloudevents" weight: 2100 -description: "Learn why Dapr uses CloudEvents, how they work in Dapr Pub/Sub, and how to create CloudEvents." +description: "Learn why Dapr uses CloudEvents, how they work in Dapr pub/sub, and how to create CloudEvents." --- 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 CloudEvents envelope, using the [`Content-Type` header value]({{< ref "pubsub-overview.md#content-types" >}}) for `datacontenttype` attribute. @@ -62,7 +62,7 @@ As another example of a v1.0 CloudEvent, the following shows data as XML content ## Publish your own CloudEvent -If you want to use your own CloudEvent, make sure to specify the [content type]({{< ref "pubsub-overview.md#setting-message-content-types" >}}) as `application/cloudevents+json`. +If you want to use your own CloudEvent, make sure to specify the [`datacontenttype`]({{< ref "pubsub-overview.md#setting-message-content-types" >}}) as `application/cloudevents+json`. ### Example @@ -103,7 +103,7 @@ Invoke-RestMethod -Method Post -ContentType 'application/cloudevents+json' -Body ## Next steps - Learn why you might [not want to use CloudEvents]({{< ref pubsub-raw.md >}}) -- Try out the [Pub/sub Quickstart]({{< ref pubsub-quickstart.md >}}) -- List of [Pub/sub components]({{< ref setup-pubsub >}}) +- Try out the [pub/sub Quickstart]({{< ref pubsub-quickstart.md >}}) +- List of [pub/sub components]({{< ref setup-pubsub >}}) - Read the [API reference]({{< ref pubsub_api.md >}}) diff --git a/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-message-ttl.md b/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-message-ttl.md index a30acdc5253..d6029842c73 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-message-ttl.md +++ b/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-message-ttl.md @@ -3,7 +3,7 @@ type: docs title: "Message Time-to-Live (TTL)" linkTitle: "Message TTL" weight: 6000 -description: "Use time-to-live in Pub/Sub messages." +description: "Use time-to-live in pub/sub messages." --- ## Introduction @@ -18,6 +18,11 @@ In some components, such as Kafka, time-to-live can be configured in the topic v When message time-to-live has native support in the pub/sub component, Dapr simply forwards the time-to-live configuration without adding any extra logic, keeping predictable behavior. This is helpful when the expired messages are handled differently by the component. For example, with Azure Service Bus, where expired messages are stored in the dead letter queue and are not simply deleted. +{{% alert title="Note" color="primary" %}} + You can also set message TTL for a given message broker at creation. Look at the specific characteristic of the component that you are using to see if this is suitable. + +{{% /alert %}} + ### Supported components #### Azure Service Bus @@ -85,6 +90,6 @@ See [this guide]({{< ref pubsub_api.md >}}) for a reference on the pub/sub API. ## Next steps - Learn about [topic scoping]({{< ref pubsub-scopes.md >}}) -- Learn [how to configure Pub/Sub components with multiple namespaces]({{< ref pubsub-namespaces.md >}}) +- Learn [how to configure pub/sub components with multiple namespaces]({{< ref pubsub-namespaces.md >}}) - List of [pub/sub components]({{< ref supported-pubsub >}}) - Read the [API reference]({{< ref pubsub_api.md >}}) 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 6a5393c7e49..5b8aa616a3e 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) enables microservices to communicate with each other using messages for event-driven architectures. +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 at-least-once message delivery guarantee. - Integrates with various message brokers and queuing systems. -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. +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 Pub/Sub in Dapr: +When using pub/sub in Dapr: -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. +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,11 +44,11 @@ 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. ### Sending messages using Cloud Events @@ -56,6 +56,12 @@ To enable message routing and provide additional context with each message betwe For more information, read about [messaging with CloudEvents]({{< ref pubsub-cloudevents.md >}}), or [sending raw messages without CloudEvents]({{< ref pubsub-raw.md >}}). +### Communication with applications not using Dapr and CloudEvents + +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 CloudEvents]({{< ref pubsub-raw.md >}}). + ### 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`. @@ -65,7 +71,7 @@ When publishing a message, it's important to specify the content type of the dat ### 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`). +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 @@ -80,19 +86,19 @@ For more information, read [about the subscriptions in Subscription Methods]({{< ### 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. +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. 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 is 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 -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. +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 Dapr app ID) subscribe to a topic, Dapr delivers each message to *only one instance of **that** application*. This concept is illustrated in the diagram below.

@@ -101,43 +107,30 @@ Similarly, if two different applications (with different app-IDs) subscribe to t ### 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 topic messages associated with an instance of a 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. - -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 - -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 CloudEvents]({{< ref pubsub-raw.md >}}). +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 >}}). -## Try out Pub/Sub +## Try out pub/sub ### Quickstarts and tutorials -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. | -### Start using Pub/Sub directly in your app +### Start using pub/sub directly in your app -Want to skip the quickstarts? Not a problem. You can try out the Pub/Sub building block directly in your application to publish messages and subscribe to a topic. After [Dapr is installed]({{< ref "getting-started/_index.md" >}}), you can begin using the Pub/Sub API starting with [the Pub/Sub how-to guide]({{< ref howto-publish-subscribe.md >}}). +Want to skip the quickstarts? Not a problem. You can try out the pub/sub building block directly in your application to publish messages and subscribe to a topic. After [Dapr is installed]({{< ref "getting-started/_index.md" >}}), you can begin using the pub/sub API starting with [the pub/sub how-to guide]({{< ref howto-publish-subscribe.md >}}). ## Next steps - Learn about [messaging with CloudEvents]({{< ref pubsub-cloudevents.md >}}) and when you might want to [send messages without CloudEvents]({{< ref pubsub-raw.md >}}). -- Follow [How-To: Configure Pub/Sub components with multiple namespaces]({{< ref pubsub-namespaces.md >}}). +- Follow [How-To: Configure pub/sub components with multiple namespaces]({{< ref pubsub-namespaces.md >}}). - Review the list of [pub/sub components]({{< ref setup-pubsub >}}). - Read the [API reference]({{< ref pubsub_api.md >}}). diff --git a/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-raw.md b/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-raw.md index 4c09a13f520..d5a0fbe61b0 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-raw.md +++ b/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-raw.md @@ -6,7 +6,7 @@ weight: 2200 description: "Learn when you might not use CloudEvents and how to disable them." --- -When adding Dapr to your application, some services may still need to communicate via raw Pub/Sub messages not encapsulated in CloudEvents, due to either compatibility reasons or some apps not using Dapr. Dapr enables apps to [publish and subscribe to raw events]({{< ref "pubsub-cloudevents.md#publishing-raw-messages" >}}) not wrapped in a CloudEvent. +When adding Dapr to your application, some services may still need to communicate via pub/sub messages not encapsulated in CloudEvents, due to either compatibility reasons or some apps not using Dapr. These are referred to as "raw" pub/sub messages. Dapr enables apps to [publish and subscribe to raw events]({{< ref "pubsub-cloudevents.md#publishing-raw-messages" >}}) not wrapped in a CloudEvent for compatibility. ## Publishing raw messages @@ -138,7 +138,7 @@ $app->start(); ## Declaratively subscribe to raw events -Similarly, you can subscribe to raw events declaratively by adding the `rawPayload` metadata entry to your Subscription Custom Resource Definition (CRD): +Similarly, you can subscribe to raw events declaratively by adding the `rawPayload` metadata entry to your subscription specification. ```yaml apiVersion: dapr.io/v1alpha1 @@ -160,7 +160,4 @@ scopes: - Learn more about [publishing and subscribing messages]({{< ref pubsub-overview.md >}}) - List of [pub/sub components]({{< ref supported-pubsub >}}) -- Read the [API reference]({{< ref pubsub_api.md >}}) - - - +- Read the [API reference]({{< ref pubsub_api.md >}}) \ No newline at end of file diff --git a/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-scopes.md b/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-scopes.md index 34ffa9d8879..df45ad8f376 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-scopes.md +++ b/daprdocs/content/en/developing-applications/building-blocks/pubsub/pubsub-scopes.md @@ -1,9 +1,9 @@ --- type: docs -title: "Scope Pub/Sub topic access" +title: "Scope Pub/sub topic access" linkTitle: "Scope topic access" weight: 5000 -description: "Use scopes to limit Pub/Sub topics to specific applications" +description: "Use scopes to limit pub/sub topics to specific applications" --- ## Introduction @@ -164,7 +164,7 @@ The table below shows which application is allowed to subscribe to the topics: ## Next steps -- Learn [how to configure Pub/Sub components with multiple namespaces]({{< ref pubsub-namespaces.md >}}) +- Learn [how to configure pub/sub components with multiple namespaces]({{< ref pubsub-namespaces.md >}}) - Learn about [message time-to-live]({{< ref pubsub-message-ttl.md >}}) - List of [pub/sub components]({{< ref supported-pubsub >}}) - Read the [API reference]({{< ref pubsub_api.md >}}) \ No newline at end of file diff --git a/daprdocs/content/en/developing-applications/building-blocks/pubsub/subscription-methods.md b/daprdocs/content/en/developing-applications/building-blocks/pubsub/subscription-methods.md index 5f75e83cceb..7c4d240195e 100644 --- a/daprdocs/content/en/developing-applications/building-blocks/pubsub/subscription-methods.md +++ b/daprdocs/content/en/developing-applications/building-blocks/pubsub/subscription-methods.md @@ -15,7 +15,7 @@ Dapr applications can subscribe to published topics via two methods that support | [**Declarative**]({{< ref "subscription-methods.md#declarative-subscriptions" >}}) | 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**]({{< ref "subscription-methods.md#programmatic-subscriptions" >}}) | Subscription is defined in the **user code**. The programmatic approach implements the subscription in your code. | -The examples below demonstrate Pub/sub messaging between a `checkout` app and an `orderprocessing` app via the `orders` topic. The examples demonstrate the same Dapr Pub/sub component used first declaratively, then programmatically. +The examples below demonstrate pub/sub messaging between a `checkout` app and an `orderprocessing` app via the `orders` topic. The examples demonstrate the same Dapr pub/sub component used first declaratively, then programmatically. ### Declarative subscriptions @@ -35,7 +35,7 @@ scopes: - checkout ``` -Notice, the Pub/sub component `order_pub_sub` subscribes to topic `orders`. +Notice, the pub/sub component `order_pub_sub` subscribes to topic `orders`. - The `route` field tells Dapr to send all topic messages to the `/checkout` endpoint in the app. - The `scopes` field enables this subscription for apps with IDs `orderprocessing` and `checkout`. @@ -95,7 +95,7 @@ kubectl apply -f subscription.yaml {{< /tabs >}} -In your application code, subscribe to the topic specified in the Dapr Pub/sub component. +In your application code, subscribe to the topic specified in the Dapr pub/sub component. {{< tabs ".NET" Java Python JavaScript Go >}} @@ -343,11 +343,11 @@ func main() { ## Next Steps -* Try out the [Pub/sub Quickstart]({{< ref pubsub-quickstart.md >}}) -* Follow: [How-To: Configure Pub/sub components with multiple namespaces]({{< ref pubsub-namespaces.md >}}) +* Try out the [pub/sub Quickstart]({{< ref pubsub-quickstart.md >}}) +* Follow: [How-To: Configure pub/sub components with multiple namespaces]({{< ref pubsub-namespaces.md >}}) * Learn more about [declarative and programmatic subscription methods]({{< ref subscription-methods >}}). * Learn about [topic scoping]({{< ref pubsub-scopes.md >}}) * Learn about [message TTL]({{< ref pubsub-message-ttl.md >}}) -* Learn more about [Pub/Sub with and without CloudEvent]({{< ref pubsub-cloudevents.md >}}) -* List of [Pub/sub components]({{< ref supported-pubsub.md >}}) -* Read the [Pub/sub API reference]({{< ref pubsub_api.md >}}) +* Learn more about [pub/sub with and without CloudEvent]({{< ref pubsub-cloudevents.md >}}) +* List of [pub/sub components]({{< ref supported-pubsub.md >}}) +* Read the [pub/sub API reference]({{< ref pubsub_api.md >}}) diff --git a/daprdocs/content/en/reference/api/pubsub_api.md b/daprdocs/content/en/reference/api/pubsub_api.md index a09ea6a8e37..f4d8e47fa3a 100644 --- a/daprdocs/content/en/reference/api/pubsub_api.md +++ b/daprdocs/content/en/reference/api/pubsub_api.md @@ -163,7 +163,7 @@ other | warning is logged and message to be retried ## Message envelope -Dapr Pub/Sub adheres to version 1.0 of CloudEvents. +Dapr pub/sub adheres to version 1.0 of CloudEvents. ## Related links From e8864b0129ac4ebd3a4785dd240a7b7c14ac14ab Mon Sep 17 00:00:00 2001 From: Hannah Hunter Date: Thu, 26 May 2022 15:13:55 -0500 Subject: [PATCH 8/8] updated diagram Signed-off-by: Hannah Hunter --- .../images/pubsub-overview-components.png | Bin 313021 -> 99287 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/daprdocs/static/images/pubsub-overview-components.png b/daprdocs/static/images/pubsub-overview-components.png index fb95c647dc282f67eb6275becae398e8a139e930..cc05cec2c9c82ba2217c2ff1a5a6622246e4ef94 100644 GIT binary patch literal 99287 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 z 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 Qi++;q6D6tl5=O877l+e3asU7T literal 313021 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�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

Kcc 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

6!H_Dr5 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 z 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 og1ON^wLljH3%-2fIAa?knX1;{sKf^cMOhF-i zGX9@YC@Osa-0Beb#o)}7T85!7?+2;!+FzH(KSY>*Kp>q$Zt}bB z2XEdDq{o74Z)A?DE+_e1xN)g(eUl{ z8Hw(nf01RwT#(1gZMa!GoF)UA&d{$iGI!S28N0^YgF)|E^oiVyk;>Ex(c;)RCLxh@ zkk*oZB0#bZ;15=3NFO{3MVOf?GxpcqEr#L8h$i-?d9Vp=v0?7G-;Am5u=rRRliBK!7)+Xxj`x|gzx|X zwvmnfQ>3G4ZU{3@^GR))+NN!EzDQ>-u+Ulk%A3Q!aa=9VG7+KR90T zCcFVqhE*&XQ4fRGM|8CqFVjnxLT`RfXU6cAlj{mYX@VDs(z}OkhgAjh^KB#QEIjzE zIQQ*AIeV0d$9>$Rk7?gRH^VhHqKn`yG2_FGE%C&u+h7u|Q3h#Fj~qsz2*du~Ce=4X zN_=U2vU*CY*(K}7SXw53&>=*m2nUoz21qop(GSX|!Rfj6{C-jnq@=}ms*Y<6-p1{E zt)l)|ZjH+o;UP1L2IT#{_y_tLW4My1#(mru6=Rk(Zz5xnqh5?{sq|!(^wDN;0fj?X z$xo);5-nV+Bi3(NM`}%s#H-=)wzftBZl-cyVLrkGS(l8$BqC%VsdEHFNJum{mTJ%p zx||I5(e~7nE;5gx7cFCk_X`$wnmzMayf|<^WbH$57tAF3L3~bj+&+(EQy(AKp*RH}utA+?i2a!Zs9LL9tW9TAWQ$`%T z)ZI&_d&+Opf#xw$@v!RE!B%V|uF;agL^Gy823Sr&UVvqxiH6BzOo<4tiPqfl1MEwd z+<}@lnNCrsQ85agQKLcP)g>1Wv9C$S-9&~JLVFcx{3R3zdI;`p39? zl^NY$*4{%z@L;s!=%u5a$E$DP-?fLl@0Z{GBM<DU+9u5o~rn3?Oj6)&EKLQ(h7Zq)C~{3dOq$Tlck~U zc>s&vEE>t}&jYwj4RSHRRAdGlXZjvpRwmxDEr*EkhevHv04Gx1cF0K%A$I#v7w|2V?JQT7DvUlh|kL$_crCp-pHmT}cRggIl^k^?09x zSinWDp8A6r!U1FZ2>yv09jI_^Zo$QE!z~CK?;m1*ufNMFB-psoT5ZgC@e9H0c+wyv z;DO(j+pV*N(i_<`$mP!Qr*-9Zsg`AnO963zn!207y4rWZ(wu!6l}zFtr$H1ov~B6JKF%&7lY~mavLPe~=sK>jiq$ zpjLmP8a+&}Ml7(?4F%NEW$y>S35;K12_-^(Xanbcp44m5ff#?y|0q_rZaaLcI}&xU&-CL(Xrux=-78* zz<&3!n)300^3TBI_TQ;PX_a4sf0y2(x5FODjr6f~qpt9dwsnR}b#CT4yl`3fM7DA_ zhsK`7gTmH#)sE|l3VpKAJBiZ!?+Hr(dGOGG9x7Ei?_2Q+0g6xbEpD&3f~p(P0ucMI z1)%5$5>Vw}IiKDB>^iFlDSAe>SAMmo)( z&{po8!Q}-Rt>M;ZzrteFA&@I`S%YBh_ooi5G*94E8g4Al|?m?N%9C+jP$2l4GWw`S-F#KLclB7QY$L=)dIqLIJC z+EZz6fKL8f?*okf(tGyi4PE5GZ>=JKwHgC@9`j4jhq`&0qCoE{pvdw|@8O|q7#x5d z{l+ftSGx!xyN>w9A@~$&7D2}LCB!e?S3$t%p|7x$KfB~Fh8ce~jGRIAA-{XXR>h1> zohCkp{N)9lbrHQ}M&8eU{>3c)SF^Y#WH#=*Lw<35>0ccG8iUN5rJH_p@-HSgel_{y zYknJxKfdOVxd}qcpL}i#P^vA0BSYM*C`G$onaq+^Gn|1u_8+VUEE(`JeeM5oW9ny3 zm4D}R)gQOb{@87^?;<@v2#Wrf^T|ILzW#g+>i^)2+<5#=GwR0`)_;GX%a4Hkj|Al3 zuL=JTPCVy7oKI zFt)_IYdIOLLgDOUfv?RpIbd7m_IyC;Z9d2gev<(j!FJmm?n}JMeOVg(<`8HEQz;G2 zk%Ni8H3Pp10*zoUF7Tr^utOagmw`pl2-eppa<3G2D^~9