[rabbitmq-discuss] Use a mysql databse table as the provider for rabbitmq queue
Tim Watson
tim at rabbitmq.com
Wed Oct 17 12:03:00 BST 2012
On 10/17/2012 11:40 AM, Ryan R. wrote:
> I think I understand what you mean with the shared library.
> However, in my case, RabbitMQ would only be installed if need be
> (meaning more than one of the apps are present, and two of those need
> to be synchronised for part of their data).
>
That actually complicates the picture somewhat - is there a reason why
this is the case? In a typical integration architecture, the messaging
broker is deployed centrally (on the LAN somewhere) and clients choose
whether or not they want to connect to it from whatever machine they're
running on. To me, it is sounding like you're describing an architecture
where both applications reside on the same machine and assuming that the
broker will also need to be co-resident with them, which is not really
the case, though there's nothing to prohibit that either.
> That said, using a shared library would require me to "include/import"
> said library when I need to, therefore making me change my app code
> depending of the situation I'm in.
>
Well yes, if you're going to add messaging capabilities to your
applications that don't currently support it, then you are going to have
to write *some* code and integrate it into them! :)
> And said library would only be required when there's a RabbitMQ
> available anyway.
>
I think you're making your life more complicated than it needs to be by
thinking about whether the messaging broker is available vs. not. The
broker should *always* be available when applications residing on
different machines need to communicate with one another, regardless of
whether those applications are running or not. Again, it feels like
you're trying to deal with applications running on the same machine -
have I picked that up correctly? It might help if you explained your
architecture in a bit more detail, so I can understand exactly what
you're trying to achieve.
> Now a bit further in your message you talk about a listener library.
> I'd like to know a bit more about this.
> How would an external library be able to listen to anything happening
> within my app ?
> Would it be listening on the DB queries ?
>
No, not at all. Let's say you've got two applications, App1 and App2.
You'll write some library code that both applications share, that
probably looks something like this (with *wide* variations depending on
language/platform - I've just written pseudo code to keep things simple):
-------------------------------------
function init = do
read_config_file_for_this_app
open_connection_to_broker
store_connection_somewhere_in_memory
end
function listen = do
get_connection_from_memory
read_message_from_broker
pass_message_to_application_thread_somehow
listen
end
function publish = do
get_connection_from_memory
send_message_to_broker
end
-------------------------------------
Now in your applications, you'll call the shared 'init' library function
when you're starting up to bootstrap the connection to the broker. When
your application is publishing data, it calls publish and if/when you
need to subscribe to data then you'll call 'listen'. The fact is that
'how to listen' for incoming messages really depends on how you're going
to use them. But the point is that the applications read from and write
to the messaging broker, and do so independently of database tables. You
*may* decide to do something like write a middle-man application that
periodically reads a database table and publishes each row to the
messaging broker so it can be read from a queue, or do that with a
worker thread instead of a separate application. I would *not* do
anything here with the database though. If applications need to share
data, then **they should send it to one another via message queues.** If
they need to persist data, they should persist their own data in their
own tables in the database, but they should **not use the database to
communicate with one another.** That is the key thing with using
messaging instead shared data(bases).
There is an overhead in sending (and in some cases, duplicating) data
between applications of course. This is *more* than compensated for by
the reduced coupling that comes from integrating using messaging
technology. This approach may not be suited to integrating applications
that are running on the same physical machine and are tightly and
deliberately coupled however. I can't really elaborate on the
suitability of messaging for your project without understanding a good
deal more about it I'm afraid.
I hope that clears a few things up at least! :)
Cheers,
Tim
More information about the rabbitmq-discuss
mailing list