In order to complete implementation of the spec [2] and for optimal zmq-way patterns usage. By zmq-way meaning some relaxed guarantees on reliability, but high performance and scalability. PUSH/PULL for CASTs here gives us benefit of not having redundant backward tcp-connections which DEALER/ROUTER opens. Opposite to that there is another approach provided by spec [1]. This approach has strong gurantees on messages delivery based on acknowledgements and retries. Such approach has lower performance though. The general idea is to provide both approaches in the driver and switch between them in configuration. 1. https://review.openstack.org/#/c/171131/ 2. https://review.openstack.org/#/c/187338/ Change-Id: I32712f73e2ec4114406641de5aec3b12152ad58f
61 lines
2.3 KiB
Python
61 lines
2.3 KiB
Python
# Copyright 2015 Mirantis, Inc.
|
|
#
|
|
# 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.
|
|
|
|
|
|
from oslo_messaging._drivers.zmq_driver.client.publishers.dealer \
|
|
import zmq_dealer_call_publisher
|
|
from oslo_messaging._drivers.zmq_driver.client.publishers.dealer \
|
|
import zmq_dealer_publisher
|
|
from oslo_messaging._drivers.zmq_driver.client.publishers \
|
|
import zmq_push_publisher
|
|
from oslo_messaging._drivers.zmq_driver.client import zmq_client_base
|
|
from oslo_messaging._drivers.zmq_driver import zmq_address
|
|
from oslo_messaging._drivers.zmq_driver import zmq_async
|
|
from oslo_messaging._drivers.zmq_driver import zmq_names
|
|
|
|
zmq = zmq_async.import_zmq()
|
|
|
|
|
|
class ZmqClient(zmq_client_base.ZmqClientBase):
|
|
|
|
def __init__(self, conf, matchmaker=None, allowed_remote_exmods=None):
|
|
|
|
default_publisher = zmq_dealer_publisher.DealerPublisher(
|
|
conf, matchmaker)
|
|
|
|
fanout_publisher = zmq_dealer_publisher.DealerPublisherLight(
|
|
conf, zmq_address.get_broker_address(conf)) \
|
|
if conf.use_pub_sub else default_publisher
|
|
|
|
super(ZmqClient, self).__init__(
|
|
conf, matchmaker, allowed_remote_exmods,
|
|
publishers={
|
|
zmq_names.CALL_TYPE:
|
|
zmq_dealer_call_publisher.DealerCallPublisher(
|
|
conf, matchmaker),
|
|
|
|
zmq_names.CAST_TYPE:
|
|
zmq_push_publisher.PushPublisher(conf, matchmaker),
|
|
|
|
# Here use DealerPublisherLight for sending request to proxy
|
|
# which finally uses PubPublisher to send fanout in case of
|
|
# 'use_pub_sub' option configured.
|
|
zmq_names.CAST_FANOUT_TYPE: fanout_publisher,
|
|
|
|
zmq_names.NOTIFY_TYPE: fanout_publisher,
|
|
|
|
"default": default_publisher
|
|
}
|
|
)
|