Open agerchev opened 5 years ago
No β I didn't know it existed π
Is it something you know something about?
Well, we have used in one project but we used a custom message pump. Now we saw the rebus library, and want to use it, but we have to support the Oracle AQ. I suppose we have to make a new transport.
Do you have any plans to incorporate REBUS-TaskCoordinator made by @BBGONE ?
Wow you just made me realize that I completely forgot about @bbgone 's fork.... I would have to consider it carefully, as it's a pretty central replacement, but it definitely sounds very promising.
I've created this issue, which I might have time to look at either this weekend or at the end of next week.
If you're interested in contributing an Oracle AQ-based Rebus transport, I'll be happy to help you and answer any questions you might have.
@mookid8000 I have some questions about the implementation.
Regarding the necessary schema: "The Rebus Way" πis to automatically create all of the necessary entities, like tables & queues, for things to "just work" out of the box.
It should be possible to disable this, though, so the bus can still start e.g. if it's running under an identity that does not have the necessary privileges to manage the database's schema.
Don't know if that is the case with Oracle, though β is it easy in Oracle to return a message from the exception queue back to its source queue?
The fast one uses buffered messages (not persistent to disk) but cannot use LOB type. it must be RAW and it is restricted in length. I have tested it and is roughly 2 times faster than the normal persisted messages. I was thinking to include some simple script to automatically create the queues, but there can be configured a lot more things and must be used the specific api for that purpose: https://docs.oracle.com/database/121/ARPLS/d_aqadm.htm#ARPLS65307
I understand the "The Rebus way" about message retries, but in our project it is a lot more simpler to use the retry mechanisms for message delay and retry. If i am not mistaken, there is not way in rebus, that i can retry a message exactly the specified number of times, because it will be running in a cluster of nodes (with exact copy the program that is pumping and processing messages). I see that the exceptions are buffered in memory. I may be wrong, that's why i am asking :) That's why we want to use the AQ implementation. We use the retry+delay mechanism, and when the message processing fails, it will automatically be moved to the exception queue. We process the message from the exception queue(just like normal queue) by sending some notification (email .... ) to the admins, then move the message to another queue (DL Queue). When the problem is fixed, we manually move the message from DL Queue to the normal queue for processing.
Is there a way, to configure rebus instance to use more than one input queue or i have to configure more rebus instances in one process? currently, messages are dequeued (including for exceptions queue) with a blocking call to
dequeue_options.WAIT := 2; -- wait in seconds if there is no message in the queue.
DBMS_AQ.DEQUEUE( QUEUE_NAME => 'QUEUE_NAME', DEQUEUE_OPTIONS => dequeue_options, MESSAGE_PROPERTIES => message_properties, PAYLOAD => payload, MSGID => message_handle);
We have to configure the backoffStrategy with zero backoff time, so we minimize the latency. The call is blocking(for 2 seconds i saw that you are using that value for the azure/rabbitmq version. ) so there will be no waste of CPU cycles :)
@mookid8000 I've made a version with the AQ, you can use it if you want.
Are there any plans to support Oracle AQ as a valid transport ?