BroadwayCloudPubSub

CI

A Google Cloud Pub/Sub connector for Broadway.

Documentation can be found at https://hexdocs.pm/broadway_cloud_pub_sub.

What's in the box

Installation

Add :broadway_cloud_pub_sub to your dependencies, along with an HTTP/2 adapter for :grpc:

def deps do
[
{:broadway_cloud_pub_sub, "~> 2.0"},
{:goth, "~> 1.3"},
{:grpc, "~> 1.0"},
{:protobuf, "~> 0.12"},
# Pick one HTTP/2 adapter:
{:gun, "~> 2.2"},
# or
# {:mint, "~> 1.9"},
# {:castore, "~> 1.0"}
]
end

The goth package handles Google Authentication and is required for the default token generator.

The grpc and protobuf packages are required by BroadwayCloudPubSub.Producer. You must pick one HTTP/2 adapter for the gRPC connection and add it to your mix.exs: either :gun, or :mint together with :castore.

If you only use BroadwayCloudPubSub.Pull.Producer you may omit :grpc, :protobuf, and the adapter packages.

Usage

Broadway.start_link(MyBroadway,
name: MyBroadway,
producer: [
module: {BroadwayCloudPubSub.Producer,
goth: MyGoth,
subscription: "projects/my-project/subscriptions/my-subscription",
max_outstanding_messages: 1000
}
],
processors: [default: [concurrency: 10]]
)

See BroadwayCloudPubSub.Producer for the full option reference, including flow control, reconnection backoff, graceful shutdown, and telemetry.

HTTP/2 adapter

The producer supports two adapters. Both are optional dependencies of :grpc, so you select one by adding it to your application's mix.exs (see Installation).

Then select the adapter in your producer config:

{BroadwayCloudPubSub.Producer,
goth: MyGoth,
subscription: "projects/my-project/subscriptions/my-subscription",
adapter: :mint}

Using the HTTP pull producer

If gRPC is not available in your environment or you prefer to use the HTTP pull method, use BroadwayCloudPubSub.Pull.Producer:

Broadway.start_link(MyBroadway,
name: MyBroadway,
producer: [
module: {BroadwayCloudPubSub.Pull.Producer,
goth: MyGoth,
subscription: "projects/my-project/subscriptions/my-subscription"
}
],
processors: [default: [concurrency: 10]]
)

Upgrading from 1.x

2.0 is a major release with breaking changes. The three-line summary is below; the full upgrade guide has step-by-step instructions, option mapping tables, and rationale for every change.

Breaking change 1: BroadwayCloudPubSub.Producer is now the gRPC streaming producer

The biggest change: the module name BroadwayCloudPubSub.Producer now refers to the new gRPC StreamingPull producer. The 1.x HTTP pull producer lives on under BroadwayCloudPubSub.Pull.Producer.

# 1.x — HTTP pull producer
{BroadwayCloudPubSub.Producer, goth: MyApp.Goth, subscription: "..."}
# 2.0 option A — switch to streaming (recommended, lower latency)
{BroadwayCloudPubSub.Producer,
goth: MyApp.Goth,
subscription: "...",
max_outstanding_messages: 1000}
# 2.0 option B — keep HTTP pull, one-line change
{BroadwayCloudPubSub.Pull.Producer, goth: MyApp.Goth, subscription: "..."}

The streaming producer requires :grpc, :protobuf, and an HTTP/2 adapter (:gun or :mint + :castore). If you stay on the pull producer those packages are not needed.

Breaking change 2: two modules renamed (only if referenced directly)

1.x2.0
BroadwayCloudPubSub.PullClientBroadwayCloudPubSub.Pull.FinchClient
BroadwayCloudPubSub.Client (behaviour)BroadwayCloudPubSub.Pull.Client

These only matter if you passed the module explicitly (e.g. client: BroadwayCloudPubSub.PullClient) or implemented a custom pull client with @behaviour BroadwayCloudPubSub.Client.

Breaking change 3: on_failure default changed from :noop to {:nack, 0}

Failed messages are now immediately made available for redelivery instead of waiting for the subscription's ackDeadlineSeconds to expire. This matches the behaviour of Google's own first-party client libraries.

To keep the 1.x behaviour, set the option explicitly:

{BroadwayCloudPubSub.Pull.Producer,
goth: MyApp.Goth,
subscription: "...",
on_failure: :noop}

See the full upgrade guide for all details.

License

Copyright 2019 Michael Crumm
Copyright 2020 Dashbit

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.