Vorpal Bunny is an experimental rabbitmq-jsonrpc-channel PHP driver designed to allow expedited single call HTTP delivery for Basic.Deliver calls to RabbitMQ.<div><br></div><div><meta charset="utf-8"><font class="Apple-style-span" face="helvetica, arial, freesans, clean, sans-serif"><span class="Apple-style-span" style="line-height: 20px;">The goal is to be a light-weight tool for higher throughput with smaller protocol overhead for single-call of Basic.Push per application execution. </span></font></div>

<div><font class="Apple-style-span" face="helvetica, arial, freesans, clean, sans-serif"><span class="Apple-style-span" style="line-height: 20px;"><br></span></font></div><div><font class="Apple-style-span" face="helvetica, arial, freesans, clean, sans-serif"><span class="Apple-style-span" style="line-height: 20px;">Our use case is focused on PHP web applications that span hundreds of servers with hundreds of backends each. With the existing AMQP drivers for PHP, applications can not currently maintain consistent connections and publish across application executions, instead they connect, publish and disconnect.  Vorpal Bunny is intended to reduce the overhead on the RabbitMQ server and the PHP application by using the jsonrpc-channel plugin, which maintains its own channels per session inside RabbitMQ&#39;s running instance,  eliminating most of the AMQP protocol overhead for one off message delivery.</span></font></div>

<div><font class="Apple-style-span" face="helvetica, arial, freesans, clean, sans-serif"><span class="Apple-style-span" style="line-height: 20px;"><br></span></font></div><div><font class="Apple-style-span" face="helvetica, arial, freesans, clean, sans-serif"><span class="Apple-style-span" style="line-height: 20px;">This is experimental for us and has not entered production, however I felt it may be useful for those out there who are exploring the rabbitmq-jsonrpc-channel plugin as well.</span></font></div>

<div><font class="Apple-style-span" face="helvetica, arial, freesans, clean, sans-serif"><span class="Apple-style-span" style="line-height: 20px;"><br></span></font></div><div><font class="Apple-style-span" face="helvetica, arial, freesans, clean, sans-serif"><span class="Apple-style-span" style="line-height: 20px;">Example use:</span></font></div>

<div><font class="Apple-style-span" face="helvetica, arial, freesans, clean, sans-serif"><span class="Apple-style-span" style="line-height: 20px;"><meta charset="utf-8"><span class="Apple-style-span" style="font-size: 13px; line-height: 18px; "><pre style="margin-top: 1em; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; font: normal normal normal 12px/normal Monaco, &#39;Courier New&#39;, &#39;DejaVu Sans Mono&#39;, &#39;Bitstream Vera Sans Mono&#39;, monospace; line-height: 1.5em; font-size: 12px; background-color: rgb(238, 238, 238); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: rgb(221, 221, 221); border-right-color: rgb(221, 221, 221); border-bottom-color: rgb(221, 221, 221); border-left-color: rgb(221, 221, 221); color: rgb(68, 68, 68); overflow-x: auto; overflow-y: auto; -webkit-box-shadow: rgba(0, 0, 0, 0.0664062) 0px 1px 2px inset; border-top-left-radius: 3px 3px; border-top-right-radius: 3px 3px; border-bottom-right-radius: 3px 3px; border-bottom-left-radius: 3px 3px; ">

<code style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px !important; padding-right: 0px !important; padding-bottom: 0px !important; padding-left: 0px !important; font: normal normal normal 12px/normal Monaco, &#39;Courier New&#39;, &#39;DejaVu Sans Mono&#39;, &#39;Bitstream Vera Sans Mono&#39;, monospace; line-height: 1.4em; font-size: 12px !important; background-color: rgb(238, 238, 238) !important; color: rgb(68, 68, 68) !important; border-top-width: 1px !important; border-right-width: 1px !important; border-bottom-width: 1px !important; border-left-width: 1px !important; border-top-style: none !important; border-right-style: none !important; border-bottom-style: none !important; border-left-style: none !important; border-top-color: rgb(222, 222, 222) !important; border-right-color: rgb(222, 222, 222) !important; border-bottom-color: rgb(222, 222, 222) !important; border-left-color: rgb(222, 222, 222) !important; border-width: initial !important; border-color: initial !important; "> $vb = new VorpalBunny( &#39;localhost&#39; );
 $vb-&gt;publish( &quot;test_exchange&quot;, &quot;test&quot;, &quot;Hello World!&quot; );</code></pre></span></span></font></div><div><span class="Apple-style-span" style="font-family: helvetica, arial, freesans, clean, sans-serif; line-height: 20px; "><br>

</span></div><div><span class="Apple-style-span" style="font-family: helvetica, arial, freesans, clean, sans-serif; line-height: 20px; ">The design tries to employ PHP&#39;s APC cache if available to keep one session with the RPC server active per Apache server on the RabbitMQ server. Application flow is as follows:</span></div>

<div><span class="Apple-style-span" style="font-family: helvetica, arial, freesans, clean, sans-serif; line-height: 20px; "><br></span></div><div><span class="Apple-style-span" style="font-family: helvetica, arial, freesans, clean, sans-serif; line-height: 20px; ">  1. Construct object, determining of APC cache is available</span></div>

<div><span class="Apple-style-span" style="font-family: helvetica, arial, freesans, clean, sans-serif; line-height: 20px; ">  2. On first call of publish, establish a session with the rabbitmq-jsonrpc-plugin, then send the message</span></div>

<div><span class="Apple-style-span" style="font-family: helvetica, arial, freesans, clean, sans-serif; line-height: 20px; ">  3. On subsequent calls, call publish will send without trying to establish a session and then look for an error indicating the session has timed out or is no longer available. If this is the case, re-establish the session and retry the delivery.</span></div>

<div><font class="Apple-style-span" face="helvetica, arial, freesans, clean, sans-serif"><span class="Apple-style-span" style="line-height: 20px;"><br></span></font></div><div><font class="Apple-style-span" face="helvetica, arial, freesans, clean, sans-serif"><span class="Apple-style-span" style="line-height: 20px;">Vorpal Bunny is available on GitHub at <a href="https://github.com/myYearbook/VorpalBunny">https://github.com/myYearbook/VorpalBunny</a></span></font></div>

<div><font class="Apple-style-span" face="helvetica, arial, freesans, clean, sans-serif"><span class="Apple-style-span" style="line-height: 20px;"><br></span></font></div><div><font class="Apple-style-span" face="helvetica, arial, freesans, clean, sans-serif"><span class="Apple-style-span" style="line-height: 20px;">You can also download 0.1 directly at </span></font><span class="Apple-style-span" style="font-family: helvetica, arial, freesans, clean, sans-serif; line-height: 20px; "><a href="https://github.com/myYearbook/VorpalBunny/zipball/0.1">https://github.com/myYearbook/VorpalBunny/zipball/0.1</a></span></div>

<div><font class="Apple-style-span" face="helvetica, arial, freesans, clean, sans-serif"><span class="Apple-style-span" style="line-height: 20px;"><br></span></font></div><div><font class="Apple-style-span" face="helvetica, arial, freesans, clean, sans-serif"><span class="Apple-style-span" style="line-height: 20px;">I will keep you all updated to our progress and observations to how well this performs in a high delivery transaction environment.</span></font></div>

<div><font class="Apple-style-span" face="helvetica, arial, freesans, clean, sans-serif"><span class="Apple-style-span" style="line-height: 20px;"><br></span></font></div><div><font class="Apple-style-span" face="helvetica, arial, freesans, clean, sans-serif"><span class="Apple-style-span" style="line-height: 20px;">Regards,</span></font></div>

<div><font class="Apple-style-span" face="helvetica, arial, freesans, clean, sans-serif"><span class="Apple-style-span" style="line-height: 20px;"><br>Gavin</span></font></div><div><font class="Apple-style-span" face="helvetica, arial, freesans, clean, sans-serif"><span class="Apple-style-span" style="line-height: 20px;"><br>

</span></font></div><div><font class="Apple-style-span" face="helvetica, arial, freesans, clean, sans-serif"><span class="Apple-style-span" style="line-height: 20px;"><br></span></font></div><div><font class="Apple-style-span" face="helvetica, arial, freesans, clean, sans-serif"><span class="Apple-style-span" style="line-height: 20px;"><br>

</span></font></div><div><font class="Apple-style-span" face="helvetica, arial, freesans, clean, sans-serif"><span class="Apple-style-span" style="line-height: 20px;"><br></span></font></div><div><font class="Apple-style-span" face="helvetica, arial, freesans, clean, sans-serif"><span class="Apple-style-span" style="line-height: 20px;"><br>

</span></font></div>