def client() -> PublisherClient: if "PUBSUB_EMULATOR_HOST" not in os.environ: client = PublisherClient(channel=grpc.insecure_channel(target="")) else: client = PublisherClient() client._batch_class = AsyncioBatch return client
def get_client(config: dict) -> PublisherClient: """Create a pubsub client.""" # Initialize PubSub client timeout = config.get("PUBLISH_TIMEOUT_SECONDS", None) client = PublisherClient() client.api.publish = partial( client.api.publish, retry=Retry(TRANSIENT_ERRORS, deadline=timeout), timeout=timeout, ) client._batch_class = AsyncioBatch return client
def init_app(app: Sanic) -> Tuple[PublisherClient, SQLiteAckQueue]: """Initialize Sanic app with url rules.""" # Initialize PubSub client timeout = app.config.get("PUBLISH_TIMEOUT_SECONDS", None) client = PublisherClient() client.api.publish = partial( client.api.publish, retry=Retry(TRANSIENT_ERRORS, deadline=timeout), timeout=timeout, ) client._batch_class = AsyncioBatch # Use a SQLiteAckQueue because: # * we use acks to ensure messages only removed on success # * persist-queue's SQLite*Queue is faster than its Queue # * SQLite provides thread-safe and process-safe access queue_config = { key[6:].lower(): value for key, value in app.config.items() if key.startswith("QUEUE_") } q = SQLiteAckQueue(**queue_config) # get metadata_headers config metadata_headers = app.config["METADATA_HEADERS"] # validate attribute keys for attribute in metadata_headers.values(): if len(attribute.encode("utf8")) > 256: # https://cloud.google.com/pubsub/quotas#resource_limits raise ValueError("Metadata attribute exceeds key size limit of 256 bytes") # generate one view_func per topic handlers = { route.topic: partial( submit, client=client, q=q, topic=route.topic, metadata_headers=metadata_headers, ) for route in app.config["ROUTE_TABLE"] } # add routes for ROUTE_TABLE for route in app.config["ROUTE_TABLE"]: app.add_route( handler=handlers[route.topic], uri=route.uri, methods=[method.upper() for method in route.methods], # required because handler.__name__ does not exist # must be a unique name for each handler name="submit_" + route.topic, ) return client, q