google-cloud-pubsub 1.0.2 → 2.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/AUTHENTICATION.md +16 -54
- data/CHANGELOG.md +464 -0
- data/CONTRIBUTING.md +328 -116
- data/EMULATOR.md +1 -1
- data/LOGGING.md +94 -2
- data/OVERVIEW.md +121 -68
- data/TROUBLESHOOTING.md +2 -8
- data/lib/google/cloud/pubsub/acknowledge_result.rb +79 -0
- data/lib/google/cloud/pubsub/async_publisher/batch.rb +319 -0
- data/lib/google/cloud/pubsub/async_publisher.rb +231 -156
- data/lib/google/cloud/pubsub/batch_publisher.rb +60 -30
- data/lib/google/cloud/pubsub/convert.rb +33 -7
- data/lib/google/cloud/pubsub/credentials.rb +2 -2
- data/lib/google/cloud/pubsub/errors.rb +93 -0
- data/lib/google/cloud/pubsub/flow_controller.rb +137 -0
- data/lib/google/cloud/pubsub/message.rb +45 -4
- data/lib/google/cloud/pubsub/policy.rb +3 -2
- data/lib/google/cloud/pubsub/project.rb +316 -49
- data/lib/google/cloud/pubsub/publish_result.rb +6 -1
- data/lib/google/cloud/pubsub/received_message.rb +171 -10
- data/lib/google/cloud/pubsub/retry_policy.rb +88 -0
- data/lib/google/cloud/pubsub/schema/list.rb +180 -0
- data/lib/google/cloud/pubsub/schema.rb +310 -0
- data/lib/google/cloud/pubsub/service.rb +285 -269
- data/lib/google/cloud/pubsub/snapshot/list.rb +4 -6
- data/lib/google/cloud/pubsub/snapshot.rb +5 -2
- data/lib/google/cloud/pubsub/subscriber/inventory.rb +69 -32
- data/lib/google/cloud/pubsub/subscriber/sequencer.rb +115 -0
- data/lib/google/cloud/pubsub/subscriber/stream.rb +108 -49
- data/lib/google/cloud/pubsub/subscriber/timed_unary_buffer.rb +191 -30
- data/lib/google/cloud/pubsub/subscriber.rb +155 -45
- data/lib/google/cloud/pubsub/subscription/list.rb +4 -6
- data/lib/google/cloud/pubsub/subscription/push_config.rb +55 -31
- data/lib/google/cloud/pubsub/subscription.rb +561 -77
- data/lib/google/cloud/pubsub/topic/list.rb +4 -6
- data/lib/google/cloud/pubsub/topic.rb +372 -52
- data/lib/google/cloud/pubsub/version.rb +1 -1
- data/lib/google/cloud/pubsub.rb +35 -46
- data/lib/google-cloud-pubsub.rb +21 -27
- metadata +26 -189
- data/lib/google/cloud/pubsub/v1/credentials.rb +0 -41
- data/lib/google/cloud/pubsub/v1/doc/google/iam/v1/iam_policy.rb +0 -21
- data/lib/google/cloud/pubsub/v1/doc/google/iam/v1/options.rb +0 -21
- data/lib/google/cloud/pubsub/v1/doc/google/iam/v1/policy.rb +0 -21
- data/lib/google/cloud/pubsub/v1/doc/google/protobuf/duration.rb +0 -91
- data/lib/google/cloud/pubsub/v1/doc/google/protobuf/empty.rb +0 -29
- data/lib/google/cloud/pubsub/v1/doc/google/protobuf/field_mask.rb +0 -222
- data/lib/google/cloud/pubsub/v1/doc/google/protobuf/timestamp.rb +0 -113
- data/lib/google/cloud/pubsub/v1/doc/google/pubsub/v1/pubsub.rb +0 -744
- data/lib/google/cloud/pubsub/v1/doc/google/type/expr.rb +0 -19
- data/lib/google/cloud/pubsub/v1/publisher_client.rb +0 -786
- data/lib/google/cloud/pubsub/v1/publisher_client_config.json +0 -105
- data/lib/google/cloud/pubsub/v1/subscriber_client.rb +0 -1385
- data/lib/google/cloud/pubsub/v1/subscriber_client_config.json +0 -138
- data/lib/google/cloud/pubsub/v1.rb +0 -17
- data/lib/google/pubsub/v1/pubsub_pb.rb +0 -249
- data/lib/google/pubsub/v1/pubsub_services_pb.rb +0 -211
@@ -124,17 +124,15 @@ module Google
|
|
124
124
|
# puts topic.name
|
125
125
|
# end
|
126
126
|
#
|
127
|
-
def all request_limit: nil
|
127
|
+
def all request_limit: nil, &block
|
128
128
|
request_limit = request_limit.to_i if request_limit
|
129
|
-
unless block_given?
|
130
|
-
return enum_for :all, request_limit: request_limit
|
131
|
-
end
|
129
|
+
return enum_for :all, request_limit: request_limit unless block_given?
|
132
130
|
results = self
|
133
131
|
loop do
|
134
|
-
results.each
|
132
|
+
results.each(&block)
|
135
133
|
if request_limit
|
136
134
|
request_limit -= 1
|
137
|
-
break if request_limit
|
135
|
+
break if request_limit.negative?
|
138
136
|
end
|
139
137
|
break unless results.next?
|
140
138
|
results = results.next
|
@@ -19,6 +19,7 @@ require "google/cloud/pubsub/async_publisher"
|
|
19
19
|
require "google/cloud/pubsub/batch_publisher"
|
20
20
|
require "google/cloud/pubsub/subscription"
|
21
21
|
require "google/cloud/pubsub/policy"
|
22
|
+
require "google/cloud/pubsub/retry_policy"
|
22
23
|
|
23
24
|
module Google
|
24
25
|
module Cloud
|
@@ -77,17 +78,17 @@ module Google
|
|
77
78
|
# end
|
78
79
|
# end
|
79
80
|
#
|
80
|
-
# topic.async_publisher.stop
|
81
|
+
# topic.async_publisher.stop!
|
81
82
|
#
|
82
83
|
def async_publisher
|
83
84
|
@async_publisher
|
84
85
|
end
|
85
86
|
|
86
87
|
##
|
87
|
-
# The name of the topic
|
88
|
-
# "/projects/project-identifier/topics/topic-name".
|
88
|
+
# The name of the topic.
|
89
89
|
#
|
90
|
-
# @return [String]
|
90
|
+
# @return [String] A fully-qualified topic name in the form
|
91
|
+
# `projects/{project_id}/topics/{topic_id}`.
|
91
92
|
#
|
92
93
|
def name
|
93
94
|
return @resource_name if reference?
|
@@ -126,8 +127,7 @@ module Google
|
|
126
127
|
#
|
127
128
|
def labels= new_labels
|
128
129
|
raise ArgumentError, "Value must be a Hash" if new_labels.nil?
|
129
|
-
update_grpc = Google::Cloud::PubSub::V1::Topic.new
|
130
|
-
name: name, labels: new_labels
|
130
|
+
update_grpc = Google::Cloud::PubSub::V1::Topic.new name: name, labels: new_labels
|
131
131
|
@grpc = service.update_topic update_grpc, :labels
|
132
132
|
@resource_name = nil
|
133
133
|
end
|
@@ -176,8 +176,7 @@ module Google
|
|
176
176
|
# topic.kms_key = key_name
|
177
177
|
#
|
178
178
|
def kms_key= new_kms_key_name
|
179
|
-
update_grpc = Google::Cloud::PubSub::V1::Topic.new
|
180
|
-
name: name, kms_key_name: new_kms_key_name
|
179
|
+
update_grpc = Google::Cloud::PubSub::V1::Topic.new name: name, kms_key_name: new_kms_key_name
|
181
180
|
@grpc = service.update_topic update_grpc, :kms_key_name
|
182
181
|
@resource_name = nil
|
183
182
|
end
|
@@ -229,13 +228,120 @@ module Google
|
|
229
228
|
#
|
230
229
|
def persistence_regions= new_persistence_regions
|
231
230
|
update_grpc = Google::Cloud::PubSub::V1::Topic.new \
|
232
|
-
name: name, message_storage_policy: {
|
233
|
-
allowed_persistence_regions: Array(new_persistence_regions)
|
234
|
-
}
|
231
|
+
name: name, message_storage_policy: { allowed_persistence_regions: Array(new_persistence_regions) }
|
235
232
|
@grpc = service.update_topic update_grpc, :message_storage_policy
|
236
233
|
@resource_name = nil
|
237
234
|
end
|
238
235
|
|
236
|
+
##
|
237
|
+
# The name of the schema that messages published should be validated against, if schema settings are configured
|
238
|
+
# for the topic. The value is a fully-qualified schema name in the form
|
239
|
+
# `projects/{project_id}/schemas/{schema_id}`. If present, {#message_encoding} should also be present. The value
|
240
|
+
# of this field will be `_deleted-schema_` if the schema has been deleted.
|
241
|
+
#
|
242
|
+
# Makes an API call to retrieve the schema settings when called on a reference object. See {#reference?}.
|
243
|
+
#
|
244
|
+
# @return [String, nil] The schema name, or `nil` if schema settings are not configured for the topic.
|
245
|
+
#
|
246
|
+
# @example
|
247
|
+
# require "google/cloud/pubsub"
|
248
|
+
#
|
249
|
+
# pubsub = Google::Cloud::PubSub.new
|
250
|
+
#
|
251
|
+
# topic = pubsub.topic "my-topic"
|
252
|
+
#
|
253
|
+
# topic.schema_name #=> "projects/my-project/schemas/my-schema"
|
254
|
+
#
|
255
|
+
def schema_name
|
256
|
+
ensure_grpc!
|
257
|
+
@grpc.schema_settings&.schema
|
258
|
+
end
|
259
|
+
|
260
|
+
##
|
261
|
+
# The encoding of messages validated against the schema identified by {#schema_name}. If present, {#schema_name}
|
262
|
+
# should also be present. Values include:
|
263
|
+
#
|
264
|
+
# * `JSON` - JSON encoding.
|
265
|
+
# * `BINARY` - Binary encoding, as defined by the schema type. For some schema types, binary encoding may not be
|
266
|
+
# available.
|
267
|
+
#
|
268
|
+
# Makes an API call to retrieve the schema settings when called on a reference object. See {#reference?}.
|
269
|
+
#
|
270
|
+
# @return [Symbol, nil] The schema encoding, or `nil` if schema settings are not configured for the topic.
|
271
|
+
#
|
272
|
+
# @example
|
273
|
+
# require "google/cloud/pubsub"
|
274
|
+
#
|
275
|
+
# pubsub = Google::Cloud::PubSub.new
|
276
|
+
#
|
277
|
+
# topic = pubsub.topic "my-topic"
|
278
|
+
#
|
279
|
+
# topic.message_encoding #=> :JSON
|
280
|
+
#
|
281
|
+
def message_encoding
|
282
|
+
ensure_grpc!
|
283
|
+
@grpc.schema_settings&.encoding
|
284
|
+
end
|
285
|
+
|
286
|
+
##
|
287
|
+
# Checks if the encoding of messages in the schema settings is `BINARY`. See {#message_encoding}.
|
288
|
+
#
|
289
|
+
# Makes an API call to retrieve the schema settings when called on a reference object. See {#reference?}.
|
290
|
+
#
|
291
|
+
# @return [Boolean] `true` when `BINARY`, `false` if not `BINARY` or schema settings is not set.
|
292
|
+
#
|
293
|
+
def message_encoding_binary?
|
294
|
+
message_encoding.to_s.upcase == "BINARY"
|
295
|
+
end
|
296
|
+
|
297
|
+
##
|
298
|
+
# Checks if the encoding of messages in the schema settings is `JSON`. See {#message_encoding}.
|
299
|
+
#
|
300
|
+
# Makes an API call to retrieve the schema settings when called on a reference object. See {#reference?}.
|
301
|
+
#
|
302
|
+
# @return [Boolean] `true` when `JSON`, `false` if not `JSON` or schema settings is not set.
|
303
|
+
#
|
304
|
+
def message_encoding_json?
|
305
|
+
message_encoding.to_s.upcase == "JSON"
|
306
|
+
end
|
307
|
+
|
308
|
+
##
|
309
|
+
# Indicates the minimum number of seconds to retain a message after it is
|
310
|
+
# published to the topic. If this field is set, messages published to the topic
|
311
|
+
# within the `retention` number of seconds are always available to subscribers.
|
312
|
+
# For instance, it allows any attached subscription to [seek to a
|
313
|
+
# timestamp](https://cloud.google.com/pubsub/docs/replay-overview#seek_to_a_time)
|
314
|
+
# that is up to `retention` number of seconds in the past. If this field is
|
315
|
+
# not set, message retention is controlled by settings on individual
|
316
|
+
# subscriptions. Cannot be less than 600 (10 minutes) or more than 604,800 (7 days).
|
317
|
+
# See {#retention=}.
|
318
|
+
#
|
319
|
+
# Makes an API call to retrieve the retention value when called on a
|
320
|
+
# reference object. See {#reference?}.
|
321
|
+
#
|
322
|
+
# @return [Numeric, nil] The message retention duration in seconds, or `nil` if not set.
|
323
|
+
#
|
324
|
+
def retention
|
325
|
+
ensure_grpc!
|
326
|
+
Convert.duration_to_number @grpc.message_retention_duration
|
327
|
+
end
|
328
|
+
|
329
|
+
##
|
330
|
+
# Sets the message retention duration in seconds. If set to a positive duration
|
331
|
+
# between 600 (10 minutes) and 604,800 (7 days), inclusive, the message retention
|
332
|
+
# duration is changed. If set to `nil`, this clears message retention duration
|
333
|
+
# from the topic. See {#retention}.
|
334
|
+
#
|
335
|
+
# @param [Numeric, nil] new_retention The new message retention duration value.
|
336
|
+
#
|
337
|
+
def retention= new_retention
|
338
|
+
new_retention_duration = Convert.number_to_duration new_retention
|
339
|
+
update_grpc = Google::Cloud::PubSub::V1::Topic.new name: name,
|
340
|
+
message_retention_duration: new_retention_duration
|
341
|
+
@grpc = service.update_topic update_grpc, :message_retention_duration
|
342
|
+
@resource_name = nil
|
343
|
+
end
|
344
|
+
|
239
345
|
##
|
240
346
|
# Permanently deletes the topic.
|
241
347
|
#
|
@@ -258,28 +364,38 @@ module Google
|
|
258
364
|
##
|
259
365
|
# Creates a new {Subscription} object on the current Topic.
|
260
366
|
#
|
261
|
-
# @
|
262
|
-
#
|
263
|
-
#
|
264
|
-
#
|
265
|
-
#
|
266
|
-
#
|
367
|
+
# @option options [String] subscription_name Name of the new subscription. Required.
|
368
|
+
# The value can be a simple subscription ID (relative name), in which
|
369
|
+
# case the current project ID will be supplied, or a fully-qualified
|
370
|
+
# subscription name in the form
|
371
|
+
# `projects/{project_id}/subscriptions/{subscription_id}`.
|
372
|
+
#
|
373
|
+
# The subscription ID (relative name) must start with a letter, and
|
374
|
+
# contain only letters (`[A-Za-z]`), numbers (`[0-9]`), dashes (`-`),
|
375
|
+
# underscores (`_`), periods (`.`), tildes (`~`), plus (`+`) or percent
|
376
|
+
# signs (`%`). It must be between 3 and 255 characters in length, and
|
377
|
+
# it must not start with `goog`.
|
378
|
+
# @option options [Integer] deadline The maximum number of seconds after a
|
267
379
|
# subscriber receives a message before the subscriber should
|
268
380
|
# acknowledge the message.
|
269
|
-
# @
|
381
|
+
# @option options [Boolean] retain_acked Indicates whether to retain acknowledged
|
270
382
|
# messages. If `true`, then messages are not expunged from the
|
271
383
|
# subscription's backlog, even if they are acknowledged, until they
|
272
384
|
# fall out of the `retention` window. Default is `false`.
|
273
|
-
# @
|
385
|
+
# @option options [Numeric] retention How long to retain unacknowledged messages
|
274
386
|
# in the subscription's backlog, from the moment a message is
|
275
387
|
# published. If `retain_acked` is `true`, then this also configures
|
276
388
|
# the retention of acknowledged messages, and thus configures how far
|
277
389
|
# back in time a {Subscription#seek} can be done. Cannot be more than
|
278
390
|
# 604,800 seconds (7 days) or less than 600 seconds (10 minutes).
|
279
391
|
# Default is 604,800 seconds (7 days).
|
280
|
-
# @
|
281
|
-
# should be pushed.
|
282
|
-
# @
|
392
|
+
# @option options [String] endpoint A URL locating the endpoint to which messages
|
393
|
+
# should be pushed. The parameters `push_config` and `endpoint` should not both be provided.
|
394
|
+
# @option options [Google::Cloud::PubSub::Subscription::PushConfig] push_config
|
395
|
+
# The configuration for a push delivery endpoint that should contain the endpoint,
|
396
|
+
# and can contain authentication data (OIDC token authentication).
|
397
|
+
# The parameters `push_config` and `endpoint` should not both be provided.
|
398
|
+
# @option options [Hash] labels A hash of user-provided labels associated with
|
283
399
|
# the subscription. You can use these to organize and group your
|
284
400
|
# subscriptions. Label keys and values can be no longer than 63
|
285
401
|
# characters, can only contain lowercase letters, numeric characters,
|
@@ -287,6 +403,31 @@ module Google
|
|
287
403
|
# values are optional. Label keys must start with a letter and each
|
288
404
|
# label in the list must have a different key. See [Creating and
|
289
405
|
# Managing Labels](https://cloud.google.com/pubsub/docs/labels).
|
406
|
+
# @option options [Boolean] message_ordering Whether to enable message ordering
|
407
|
+
# on the subscription.
|
408
|
+
# @option options [String] filter An expression written in the Cloud Pub/Sub filter language.
|
409
|
+
# If non-empty, then only {Message} instances whose `attributes` field
|
410
|
+
# matches the filter are delivered on this subscription. If
|
411
|
+
# empty, then no messages are filtered out. Optional.
|
412
|
+
# @option options [Topic] dead_letter_topic
|
413
|
+
# The {Topic} to which dead letter messages for the subscription should be published.
|
414
|
+
# Dead lettering is done on a best effort basis. The same message might be dead lettered multiple
|
415
|
+
# times. The Cloud Pub/Sub service account associated with the enclosing subscription's parent project (i.e.,
|
416
|
+
# `service-{project_number}@gcp-sa-pubsub.iam.gserviceaccount.com`) must have permission to Publish() to
|
417
|
+
# this topic.
|
418
|
+
#
|
419
|
+
# The operation will fail if the topic does not exist. Users should ensure that there is a subscription
|
420
|
+
# attached to this topic since messages published to a topic with no subscriptions are lost.
|
421
|
+
# @option options [Integer] dead_letter_max_delivery_attempts
|
422
|
+
# The maximum number of delivery attempts for any message in the subscription's dead letter policy.
|
423
|
+
# Dead lettering is done on a best effort basis. The same message might
|
424
|
+
# be dead lettered multiple times. The value must be between 5 and 100. If this parameter is 0, a default
|
425
|
+
# value of 5 is used. The `dead_letter_topic` must also be set.
|
426
|
+
# @option options [RetryPolicy] retry_policy
|
427
|
+
# A policy that specifies how Cloud Pub/Sub retries message delivery for this subscription.
|
428
|
+
# If not set, the default retry policy is applied. This generally implies that messages
|
429
|
+
# will be retried as soon as possible for healthy subscribers. Retry Policy will be triggered on NACKs or
|
430
|
+
# acknowledgement deadline exceeded events for a given message.
|
290
431
|
#
|
291
432
|
# @return [Google::Cloud::PubSub::Subscription]
|
292
433
|
#
|
@@ -299,21 +440,74 @@ module Google
|
|
299
440
|
# sub = topic.subscribe "my-topic-sub"
|
300
441
|
# sub.name # => "my-topic-sub"
|
301
442
|
#
|
302
|
-
# @example Wait 2 minutes for acknowledgement
|
443
|
+
# @example Wait 2 minutes for acknowledgement:
|
444
|
+
# require "google/cloud/pubsub"
|
445
|
+
#
|
446
|
+
# pubsub = Google::Cloud::PubSub.new
|
447
|
+
#
|
448
|
+
# topic = pubsub.topic "my-topic"
|
449
|
+
# sub = topic.subscribe "my-topic-sub",
|
450
|
+
# deadline: 120
|
451
|
+
#
|
452
|
+
# @example Configure a push endpoint:
|
303
453
|
# require "google/cloud/pubsub"
|
304
454
|
#
|
305
455
|
# pubsub = Google::Cloud::PubSub.new
|
456
|
+
# topic = pubsub.topic "my-topic"
|
457
|
+
#
|
458
|
+
# push_config = Google::Cloud::PubSub::Subscription::PushConfig.new endpoint: "http://example.net/callback"
|
459
|
+
# push_config.set_oidc_token "service-account@example.net", "audience-header-value"
|
460
|
+
#
|
461
|
+
# sub = topic.subscribe "my-subscription", push_config: push_config
|
462
|
+
#
|
463
|
+
# @example Configure a Dead Letter Queues policy:
|
464
|
+
# require "google/cloud/pubsub"
|
465
|
+
#
|
466
|
+
# pubsub = Google::Cloud::PubSub.new
|
467
|
+
#
|
468
|
+
# # Dead Letter Queue (DLQ) testing requires IAM bindings to the Cloud Pub/Sub service account that is
|
469
|
+
# # automatically created and managed by the service team in a private project.
|
470
|
+
# my_project_number = "000000000000"
|
471
|
+
# service_account_email = "serviceAccount:service-#{my_project_number}@gcp-sa-pubsub.iam.gserviceaccount.com"
|
472
|
+
#
|
473
|
+
# dead_letter_topic = pubsub.topic "my-dead-letter-topic"
|
474
|
+
# dead_letter_subscription = dead_letter_topic.subscribe "my-dead-letter-sub"
|
475
|
+
#
|
476
|
+
# dead_letter_topic.policy { |p| p.add "roles/pubsub.publisher", service_account_email }
|
477
|
+
# dead_letter_subscription.policy { |p| p.add "roles/pubsub.subscriber", service_account_email }
|
306
478
|
#
|
307
479
|
# topic = pubsub.topic "my-topic"
|
308
480
|
# sub = topic.subscribe "my-topic-sub",
|
309
|
-
#
|
310
|
-
#
|
481
|
+
# dead_letter_topic: dead_letter_topic,
|
482
|
+
# dead_letter_max_delivery_attempts: 10
|
483
|
+
#
|
484
|
+
# @example Configure a Retry Policy:
|
485
|
+
# require "google/cloud/pubsub"
|
486
|
+
#
|
487
|
+
# pubsub = Google::Cloud::PubSub.new
|
488
|
+
#
|
489
|
+
# topic = pubsub.topic "my-topic"
|
311
490
|
#
|
312
|
-
|
313
|
-
|
491
|
+
# retry_policy = Google::Cloud::PubSub::RetryPolicy.new minimum_backoff: 5, maximum_backoff: 300
|
492
|
+
# sub = topic.subscribe "my-topic-sub", retry_policy: retry_policy
|
493
|
+
#
|
494
|
+
def subscribe subscription_name, **options
|
314
495
|
ensure_service!
|
315
|
-
options
|
316
|
-
|
496
|
+
if options[:push_config] && options[:endpoint]
|
497
|
+
raise ArgumentError, "endpoint and push_config were both provided. Please provide only one."
|
498
|
+
end
|
499
|
+
if options[:endpoint]
|
500
|
+
options[:push_config] =
|
501
|
+
Google::Cloud::PubSub::Subscription::PushConfig.new endpoint: options[:endpoint]
|
502
|
+
end
|
503
|
+
|
504
|
+
options[:dead_letter_topic_name] = options[:dead_letter_topic].name if options[:dead_letter_topic]
|
505
|
+
if options[:dead_letter_max_delivery_attempts] && !options[:dead_letter_topic_name]
|
506
|
+
# Service error message "3:Invalid resource name given (name=)." does not identify param.
|
507
|
+
raise ArgumentError, "dead_letter_topic is required with dead_letter_max_delivery_attempts"
|
508
|
+
end
|
509
|
+
options[:push_config] = options[:push_config].to_grpc if options[:push_config]
|
510
|
+
options[:retry_policy] = options[:retry_policy].to_grpc if options[:retry_policy]
|
317
511
|
grpc = service.create_subscription name, subscription_name, options
|
318
512
|
Subscription.from_grpc grpc, service
|
319
513
|
end
|
@@ -323,7 +517,11 @@ module Google
|
|
323
517
|
##
|
324
518
|
# Retrieves subscription by name.
|
325
519
|
#
|
326
|
-
# @param [String] subscription_name Name of a subscription.
|
520
|
+
# @param [String] subscription_name Name of a subscription. The value
|
521
|
+
# can be a simple subscription ID (relative name), in which case the
|
522
|
+
# current project ID will be supplied, or a fully-qualified
|
523
|
+
# subscription name in the form
|
524
|
+
# `projects/{project_id}/subscriptions/{subscription_id}`.
|
327
525
|
# @param [Boolean] skip_lookup Optionally create a {Subscription} object
|
328
526
|
# without verifying the subscription resource exists on the Pub/Sub
|
329
527
|
# service. Calls made on this object will raise errors if the service
|
@@ -355,9 +553,7 @@ module Google
|
|
355
553
|
#
|
356
554
|
def subscription subscription_name, skip_lookup: nil
|
357
555
|
ensure_service!
|
358
|
-
if skip_lookup
|
359
|
-
return Subscription.from_name subscription_name, service
|
360
|
-
end
|
556
|
+
return Subscription.from_name subscription_name, service if skip_lookup
|
361
557
|
grpc = service.get_subscription subscription_name
|
362
558
|
Subscription.from_grpc grpc, service
|
363
559
|
rescue Google::Cloud::NotFoundError
|
@@ -416,6 +612,8 @@ module Google
|
|
416
612
|
# @param [String, File] data The message payload. This will be converted
|
417
613
|
# to bytes encoded as ASCII-8BIT.
|
418
614
|
# @param [Hash] attributes Optional attributes for the message.
|
615
|
+
# @param [String] ordering_key Identifies related messages for which
|
616
|
+
# publish order should be respected.
|
419
617
|
# @yield [batch] a block for publishing multiple messages in one
|
420
618
|
# request
|
421
619
|
# @yieldparam [BatchPublisher] batch the topic batch publisher
|
@@ -464,26 +662,90 @@ module Google
|
|
464
662
|
# t.publish "task 3 completed", foo: :bif
|
465
663
|
# end
|
466
664
|
#
|
467
|
-
|
665
|
+
# @example Ordered messages are supported using ordering_key:
|
666
|
+
# require "google/cloud/pubsub"
|
667
|
+
#
|
668
|
+
# pubsub = Google::Cloud::PubSub.new
|
669
|
+
#
|
670
|
+
# topic = pubsub.topic "my-ordered-topic"
|
671
|
+
#
|
672
|
+
# # Ensure that message ordering is enabled.
|
673
|
+
# topic.enable_message_ordering!
|
674
|
+
#
|
675
|
+
# # Publish an ordered message with an ordering key.
|
676
|
+
# topic.publish "task completed",
|
677
|
+
# ordering_key: "task-key"
|
678
|
+
#
|
679
|
+
def publish data = nil, attributes = nil, ordering_key: nil, compress: nil, compression_bytes_threshold: nil,
|
680
|
+
**extra_attrs, &block
|
468
681
|
ensure_service!
|
469
|
-
batch = BatchPublisher.new data,
|
470
|
-
|
682
|
+
batch = BatchPublisher.new data,
|
683
|
+
attributes,
|
684
|
+
ordering_key,
|
685
|
+
extra_attrs,
|
686
|
+
compress: compress,
|
687
|
+
compression_bytes_threshold: compression_bytes_threshold
|
688
|
+
|
689
|
+
block&.call batch
|
471
690
|
return nil if batch.messages.count.zero?
|
472
|
-
publish_batch_messages
|
691
|
+
batch.publish_batch_messages name, service
|
473
692
|
end
|
474
693
|
|
475
694
|
##
|
476
|
-
# Publishes a message asynchronously to the topic
|
695
|
+
# Publishes a message asynchronously to the topic using
|
696
|
+
# {#async_publisher}.
|
477
697
|
#
|
478
698
|
# The message payload must not be empty; it must contain either a
|
479
699
|
# non-empty data field, or at least one attribute.
|
480
700
|
#
|
701
|
+
# Google Cloud Pub/Sub ordering keys provide the ability to ensure
|
702
|
+
# related messages are sent to subscribers in the order in which they
|
703
|
+
# were published. Messages can be tagged with an ordering key, a string
|
704
|
+
# that identifies related messages for which publish order should be
|
705
|
+
# respected. The service guarantees that, for a given ordering key and
|
706
|
+
# publisher, messages are sent to subscribers in the order in which they
|
707
|
+
# were published. Ordering does not require sacrificing high throughput
|
708
|
+
# or scalability, as the service automatically distributes messages for
|
709
|
+
# different ordering keys across subscribers.
|
710
|
+
#
|
711
|
+
# To use ordering keys, specify `ordering_key`. Before specifying
|
712
|
+
# `ordering_key` on a message a call to `#enable_message_ordering!` must
|
713
|
+
# be made or an error will be raised.
|
714
|
+
#
|
715
|
+
# @note At the time of this release, ordering keys are not yet publicly
|
716
|
+
# enabled and requires special project enablements.
|
717
|
+
#
|
718
|
+
# Publisher flow control limits the number of outstanding messages that
|
719
|
+
# are allowed to wait to be published. See the `flow_control` key in the
|
720
|
+
# `async` parameter in {Project#topic} for more information about publisher
|
721
|
+
# flow control settings.
|
722
|
+
#
|
481
723
|
# @param [String, File] data The message payload. This will be converted
|
482
724
|
# to bytes encoded as ASCII-8BIT.
|
483
725
|
# @param [Hash] attributes Optional attributes for the message.
|
726
|
+
# @param [String] ordering_key Identifies related messages for which
|
727
|
+
# publish order should be respected.
|
484
728
|
# @yield [result] the callback for when the message has been published
|
485
729
|
# @yieldparam [PublishResult] result the result of the asynchronous
|
486
730
|
# publish
|
731
|
+
# @raise [Google::Cloud::PubSub::AsyncPublisherStopped] when the
|
732
|
+
# publisher is stopped. (See {AsyncPublisher#stop} and
|
733
|
+
# {AsyncPublisher#stopped?}.)
|
734
|
+
# @raise [Google::Cloud::PubSub::OrderedMessagesDisabled] when
|
735
|
+
# publishing a message with an `ordering_key` but ordered messages are
|
736
|
+
# not enabled. (See {#message_ordering?} and
|
737
|
+
# {#enable_message_ordering!}.)
|
738
|
+
# @raise [Google::Cloud::PubSub::OrderingKeyError] when publishing a
|
739
|
+
# message with an `ordering_key` that has already failed when
|
740
|
+
# publishing. Use {#resume_publish} to allow this `ordering_key` to be
|
741
|
+
# published again.
|
742
|
+
# @raise [Google::Cloud::PubSub::FlowControlLimitError] when publish flow
|
743
|
+
# control limits are exceeded, and the `async` parameter key
|
744
|
+
# `flow_control.limit_exceeded_behavior` is set to `:error` or `:block`.
|
745
|
+
# If `flow_control.limit_exceeded_behavior` is set to `:block`, this error
|
746
|
+
# will be raised only when a limit would be exceeded by a single message.
|
747
|
+
# See the `async` parameter in {Project#topic} for more information about
|
748
|
+
# `flow_control` settings.
|
487
749
|
#
|
488
750
|
# @example
|
489
751
|
# require "google/cloud/pubsub"
|
@@ -499,7 +761,8 @@ module Google
|
|
499
761
|
# end
|
500
762
|
# end
|
501
763
|
#
|
502
|
-
#
|
764
|
+
# # Shut down the publisher when ready to stop publishing messages.
|
765
|
+
# topic.async_publisher.stop!
|
503
766
|
#
|
504
767
|
# @example A message can be published using a File object:
|
505
768
|
# require "google/cloud/pubsub"
|
@@ -510,7 +773,8 @@ module Google
|
|
510
773
|
# file = File.open "message.txt", mode: "rb"
|
511
774
|
# topic.publish_async file
|
512
775
|
#
|
513
|
-
#
|
776
|
+
# # Shut down the publisher when ready to stop publishing messages.
|
777
|
+
# topic.async_publisher.stop!
|
514
778
|
#
|
515
779
|
# @example Additionally, a message can be published with attributes:
|
516
780
|
# require "google/cloud/pubsub"
|
@@ -521,13 +785,76 @@ module Google
|
|
521
785
|
# topic.publish_async "task completed",
|
522
786
|
# foo: :bar, this: :that
|
523
787
|
#
|
524
|
-
#
|
788
|
+
# # Shut down the publisher when ready to stop publishing messages.
|
789
|
+
# topic.async_publisher.stop!
|
790
|
+
#
|
791
|
+
# @example Ordered messages are supported using ordering_key:
|
792
|
+
# require "google/cloud/pubsub"
|
793
|
+
#
|
794
|
+
# pubsub = Google::Cloud::PubSub.new
|
795
|
+
#
|
796
|
+
# topic = pubsub.topic "my-ordered-topic"
|
797
|
+
#
|
798
|
+
# # Ensure that message ordering is enabled.
|
799
|
+
# topic.enable_message_ordering!
|
525
800
|
#
|
526
|
-
|
801
|
+
# # Publish an ordered message with an ordering key.
|
802
|
+
# topic.publish_async "task completed",
|
803
|
+
# ordering_key: "task-key"
|
804
|
+
#
|
805
|
+
# # Shut down the publisher when ready to stop publishing messages.
|
806
|
+
# topic.async_publisher.stop!
|
807
|
+
#
|
808
|
+
def publish_async data = nil, attributes = nil, ordering_key: nil, **extra_attrs, &callback
|
527
809
|
ensure_service!
|
528
810
|
|
529
|
-
@async_publisher ||= AsyncPublisher.new name, service,
|
530
|
-
@async_publisher.publish data, attributes, &
|
811
|
+
@async_publisher ||= AsyncPublisher.new name, service, **@async_opts
|
812
|
+
@async_publisher.publish data, attributes, ordering_key: ordering_key, **extra_attrs, &callback
|
813
|
+
end
|
814
|
+
|
815
|
+
##
|
816
|
+
# Enables message ordering for messages with ordering keys on the
|
817
|
+
# {#async_publisher}. When enabled, messages published with the same
|
818
|
+
# `ordering_key` will be delivered in the order they were published.
|
819
|
+
#
|
820
|
+
# @note At the time of this release, ordering keys are not yet publicly
|
821
|
+
# enabled and requires special project enablements.
|
822
|
+
#
|
823
|
+
# See {#message_ordering?}. See {#publish_async},
|
824
|
+
# {Subscription#listen}, and {Message#ordering_key}.
|
825
|
+
#
|
826
|
+
def enable_message_ordering!
|
827
|
+
@async_publisher ||= AsyncPublisher.new name, service, **@async_opts
|
828
|
+
@async_publisher.enable_message_ordering!
|
829
|
+
end
|
830
|
+
|
831
|
+
##
|
832
|
+
# Whether message ordering for messages with ordering keys has been
|
833
|
+
# enabled on the {#async_publisher}. When enabled, messages published
|
834
|
+
# with the same `ordering_key` will be delivered in the order they were
|
835
|
+
# published. When disabled, messages may be delivered in any order.
|
836
|
+
#
|
837
|
+
# See {#enable_message_ordering!}. See {#publish_async},
|
838
|
+
# {Subscription#listen}, and {Message#ordering_key}.
|
839
|
+
#
|
840
|
+
# @return [Boolean]
|
841
|
+
#
|
842
|
+
def message_ordering?
|
843
|
+
@async_publisher ||= AsyncPublisher.new name, service, **@async_opts
|
844
|
+
@async_publisher.message_ordering?
|
845
|
+
end
|
846
|
+
|
847
|
+
##
|
848
|
+
# Resume publishing ordered messages for the provided ordering key.
|
849
|
+
#
|
850
|
+
# @param [String] ordering_key Identifies related messages for which
|
851
|
+
# publish order should be respected.
|
852
|
+
#
|
853
|
+
# @return [boolean] `true` when resumed, `false` otherwise.
|
854
|
+
#
|
855
|
+
def resume_publish ordering_key
|
856
|
+
@async_publisher ||= AsyncPublisher.new name, service, **@async_opts
|
857
|
+
@async_publisher.resume_publish ordering_key
|
531
858
|
end
|
532
859
|
|
533
860
|
##
|
@@ -745,7 +1072,7 @@ module Google
|
|
745
1072
|
# @private New reference {Topic} object without making an HTTP request.
|
746
1073
|
def self.from_name name, service, options = {}
|
747
1074
|
name = service.topic_path name, options
|
748
|
-
from_grpc(nil, service).tap do |t|
|
1075
|
+
from_grpc(nil, service, async: options[:async]).tap do |t|
|
749
1076
|
t.instance_variable_set :@resource_name, name
|
750
1077
|
end
|
751
1078
|
end
|
@@ -765,13 +1092,6 @@ module Google
|
|
765
1092
|
ensure_service!
|
766
1093
|
reload! if reference?
|
767
1094
|
end
|
768
|
-
|
769
|
-
##
|
770
|
-
# Call the publish API with arrays of data data and attrs.
|
771
|
-
def publish_batch_messages batch
|
772
|
-
grpc = service.publish name, batch.messages
|
773
|
-
batch.to_gcloud_messages Array(grpc.message_ids)
|
774
|
-
end
|
775
1095
|
end
|
776
1096
|
end
|
777
1097
|
|