Files
deb-python-oslo.messaging/oslo_messaging/_drivers/zmq_driver/client/zmq_client.py
Oleksii Zamiatin 2ae4f8faf3 [zmq] Use PUSH/PULL for direct CAST
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
2016-02-04 22:28:26 +02:00

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
}
)