oslo.messaging: remove double reply
Currently, when we are waiting for a RPC reply, for each call we receive two AMQP messages - first one with the payload, a second one to ensure the other have finish to send the payload. We are going to remove the second message for RPC reply. Co-Authored-By: Victor Sergeyev <vsergeyev@mirantis.com> Change-Id: I42106f4948279984b4dc037ca17eb9bc1cbc8207
This commit is contained in:
parent
d1d30679a2
commit
12014f2e5f
214
specs/liberty/oslo.messaging-remove-double-reply.rst
Normal file
214
specs/liberty/oslo.messaging-remove-double-reply.rst
Normal file
@ -0,0 +1,214 @@
|
|||||||
|
=====================================================
|
||||||
|
oslo.messaging: remove ending message for rpc reply
|
||||||
|
=====================================================
|
||||||
|
|
||||||
|
https://blueprints.launchpad.net/oslo.messaging?searchtext=remove-double-reply
|
||||||
|
|
||||||
|
We are going to send a single message for RPC reply.
|
||||||
|
|
||||||
|
Problem description
|
||||||
|
===================
|
||||||
|
|
||||||
|
Currently, when we wait for a RPC reply, for each msg_id we receive two AMQP
|
||||||
|
messages - first one with the payload, a second one to ensure the other have
|
||||||
|
finish to send the payload. This was made because a long time ago 'reply'
|
||||||
|
allowed generator as payload to send multiple messages on one 'rpc.call' -
|
||||||
|
see [1]_.
|
||||||
|
|
||||||
|
Oslo.messaging do not support providing a generator as the payload - it send
|
||||||
|
reply with data and then reply with ending - so it becomes useless to double
|
||||||
|
RPC messages for each call. Based on this suggestions, so we are going to
|
||||||
|
remove the second AMQP message sending.
|
||||||
|
|
||||||
|
This change will be not backward compatible, so we have to choice how we handle
|
||||||
|
this backward compatibility and the deprecation. This spec is the proposed
|
||||||
|
change about that.
|
||||||
|
|
||||||
|
Proposed change
|
||||||
|
===============
|
||||||
|
|
||||||
|
This change is not backward compatible, so we need to make sure that there is
|
||||||
|
some way to run mixed versions of services, where version N can always talk to
|
||||||
|
N+1 and the reverse, so that we can do rolling upgrades.
|
||||||
|
|
||||||
|
|
||||||
|
Plan for the rolling upgrade:
|
||||||
|
-----------------------------
|
||||||
|
|
||||||
|
In Kilo:
|
||||||
|
````````
|
||||||
|
The old behavior, fully compatible with Liberty and older versions.
|
||||||
|
|
||||||
|
RPC-server sends reply in two messages, can reply to clients, versions <= L+1.
|
||||||
|
RPC-client expects replies in two messages, can receive replies from servers
|
||||||
|
with versions <= L.
|
||||||
|
|
||||||
|
In Liberty:
|
||||||
|
```````````
|
||||||
|
We are going to implement a new behavior, but keep the old one by default.
|
||||||
|
Fully compatible with Kilo and older versions.
|
||||||
|
|
||||||
|
We change the ReplyWaiters to handle reply in one message and two messages,
|
||||||
|
like it does [2]_.
|
||||||
|
|
||||||
|
We create a boolean configuration option, defaulted to False. If this one is
|
||||||
|
True, we sent the reply in one message otherwise we keep the current behavior
|
||||||
|
of two messages. This config option will allow us to test the both - old and
|
||||||
|
new - behavior into our tests suite and allow to enable this new behavior
|
||||||
|
earlier. So this is only dedicated for early adopter and testing.
|
||||||
|
This options is not need in normal upgrade workflow and must be removed as soon
|
||||||
|
as we enable the new behavior by default to be sure that deployed cloud with
|
||||||
|
L+1 will not break when they are upgraded to L+2 because cloud operator
|
||||||
|
enforced the old behavior.
|
||||||
|
|
||||||
|
RPC-server sends reply in two messages, can reply to <= L+1
|
||||||
|
RPC-client expects replies in two messages or one message, can receive replies
|
||||||
|
from all versions
|
||||||
|
|
||||||
|
In M release cycle:
|
||||||
|
```````````````````
|
||||||
|
We are going to enable the new behavior by default, remove the config option
|
||||||
|
and support only the reply in one message. This will break backward
|
||||||
|
compatibility with oslo.messaging <= kilo and oslo-incubator RPC legacy code.
|
||||||
|
|
||||||
|
rpc-server sends reply in one messages, can reply to >= L
|
||||||
|
rpc-client expects replies in two messages or one messages from all versions
|
||||||
|
|
||||||
|
In N release cycle:
|
||||||
|
```````````````````
|
||||||
|
We are going to remove legacy code that allow to receive replies from <= L.
|
||||||
|
|
||||||
|
rpc-server sends reply in one messages, can reply to >= L+1
|
||||||
|
rpc-client expects replies in one messages, can receive replies from >= L+1
|
||||||
|
|
||||||
|
|
||||||
|
Alternatives
|
||||||
|
------------
|
||||||
|
|
||||||
|
Using the oslo.messaging payload version.
|
||||||
|
But this have been designed for the content of the message itself.
|
||||||
|
Not really for this purpose. And the deserialization occurs in the lower
|
||||||
|
layer of oslo.messaging. When we handle the reply the version fields have
|
||||||
|
already been removed.
|
||||||
|
|
||||||
|
This breaks backward compatibility too.
|
||||||
|
|
||||||
|
We can already track the old and the new format because the old format has
|
||||||
|
the attribute "result" OR "ending" the new one will have "result" AND
|
||||||
|
"ending".
|
||||||
|
|
||||||
|
Note that issue is in the RPC call replies code. In case of rolling upgrade, we
|
||||||
|
have to think about the fact that the client will wait message that can
|
||||||
|
come from same or upper version of oslo.messaging. We already do not support
|
||||||
|
lower versions from the application PoV.
|
||||||
|
|
||||||
|
Or from the server point of view, we will send reply that must be
|
||||||
|
understandable by a wide panel of versions.
|
||||||
|
|
||||||
|
This is the first time (I guess), we encounter this kind of issue, some other
|
||||||
|
bugs need to break the backward compatibility to be fixed, too.
|
||||||
|
(Because we need to change RabbitMQ queue attributes or move a queue to
|
||||||
|
another exchange)
|
||||||
|
|
||||||
|
The main goal is to choose the backward compatible versions count and use
|
||||||
|
the same kind of deprecation in other changes like this one.
|
||||||
|
|
||||||
|
Impact on Existing APIs
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
NA
|
||||||
|
|
||||||
|
Security impact
|
||||||
|
---------------
|
||||||
|
|
||||||
|
NA
|
||||||
|
|
||||||
|
Performance Impact
|
||||||
|
------------------
|
||||||
|
|
||||||
|
This will reduce by 2 the number of reply messages that will transit on a
|
||||||
|
RabbitMQ/QPID cluster.
|
||||||
|
Local performance tests shows, that this change brings nearly 30 percent
|
||||||
|
increase in the number of RPC `call` messages per second.
|
||||||
|
|
||||||
|
Configuration Impact
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
A hidden configuration option will allow to switch to the future behavior
|
||||||
|
for early adopter and for testing purpose.
|
||||||
|
|
||||||
|
Developer Impact
|
||||||
|
----------------
|
||||||
|
|
||||||
|
NA
|
||||||
|
|
||||||
|
Testing Impact
|
||||||
|
--------------
|
||||||
|
|
||||||
|
We must test that the new ReplyWaiters code can handle reply that come from
|
||||||
|
a oslo.messaging version that sent reply in one message and from the one
|
||||||
|
that sent the reply into two messages. This is driver specific change, so we
|
||||||
|
should implement this in unittests.
|
||||||
|
|
||||||
|
Implementation
|
||||||
|
==============
|
||||||
|
|
||||||
|
Assignee(s)
|
||||||
|
-----------
|
||||||
|
|
||||||
|
Primary assignee:
|
||||||
|
vsergeyev
|
||||||
|
|
||||||
|
Other contributors:
|
||||||
|
sileht
|
||||||
|
|
||||||
|
Milestones
|
||||||
|
----------
|
||||||
|
|
||||||
|
Target Milestone for completion:
|
||||||
|
Liberty for the step 1
|
||||||
|
M or N for the step 2
|
||||||
|
|
||||||
|
Work Items
|
||||||
|
----------
|
||||||
|
|
||||||
|
1. Change the ReplyWaiters to handle reply in one message and two messages.
|
||||||
|
2. Add a config option and change the _send_reply() method to allow sent reply
|
||||||
|
and `ending` in a single message, based on config option.
|
||||||
|
3. Remove the config option and enable the new behavior by default.
|
||||||
|
4. Remove the `ending` parameter procession from the ReplyWaiters.
|
||||||
|
|
||||||
|
Incubation
|
||||||
|
==========
|
||||||
|
|
||||||
|
NA
|
||||||
|
|
||||||
|
Documentation Impact
|
||||||
|
====================
|
||||||
|
|
||||||
|
Inform deployer about future incompatibility with a too old oslo.messaging
|
||||||
|
version
|
||||||
|
|
||||||
|
Dependencies
|
||||||
|
============
|
||||||
|
|
||||||
|
NA
|
||||||
|
|
||||||
|
References
|
||||||
|
==========
|
||||||
|
|
||||||
|
.. [1] Legacy oslo rpc behavior: https://github.com/openstack/oslo-incubator/blob/stable/icehouse/openstack/common/rpc/amqp.py#L461-L470
|
||||||
|
.. [2] Refactor processing reply in ReplyWaiter: https://review.openstack.org/#/c/180583/
|
||||||
|
|
||||||
|
WIP reviews:
|
||||||
|
|
||||||
|
* https://review.openstack.org/#/c/180542/
|
||||||
|
* https://review.openstack.org/#/c/180583/
|
||||||
|
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
This work is licensed under a Creative Commons Attribution 3.0
|
||||||
|
Unported License.
|
||||||
|
http://creativecommons.org/licenses/by/3.0/legalcode
|
||||||
|
|
Loading…
Reference in New Issue
Block a user