On Sat, Sep 15, 2012 at 8:38 PM, Hiranya Jayathilaka <hiranya...@gmail.com>wrote:
> True. But because the xpath engine builds the whole message we end up > buffeting the whole thing in memory. > So creating an xpath engine which does not build the whole soap message would be the next step in this performance improvement. thanks, Amila. > > Sent from my iPhone > > On Sep 14, 2012, at 11:18 PM, Andreas Veithen <andreas.veit...@gmail.com> > wrote: > > > On Wed, Sep 12, 2012 at 10:36 PM, Hiranya Jayathilaka > > <hiranya...@gmail.com> wrote: > >> Hi Amila, > >> > >> AFAIU this improvement gets rid of the SOAP serialization overhead (at > the > >> cost of more memory). This is certainly an interesting idea but goes > against > >> the philosophy that we have been following up to now - we don't buffer > any > >> message content in-memory. This philosophy helps us to keep the memory > usage > >> at a reasonably constant level even under largest volumes of traffic. In > >> general we can say the memory usage will not be highly affected by a > burst > >> of very large (say > 10M) messages. But the moment we start buffering > >> message content in memory we loose that. > > > > That argument is not entirely correct. What Amila proposes is to keep > > in memory the part of the message that has already been read (plus of > > course a few KB read in advance). That would only add to the memory > > already consumed by the Axiom object model constructed for that part > > of the message. There would thus be an increase in memory usage, but > > it the increase would be roughly proportional. > > > >> I think the proper way to improve current performance level in Synapse > is to > >> get Synapse to use the pass through transport by default. We already > >> discussed this on the list [2] a few months back and the idea was to > use the > >> pass through transport by default and fix the transport so that it can > also > >> handle non-pass through scenarios (CBR, transform, security etc). I've > >> actually done a POC for this and got pretty much all the Synapse > samples to > >> work except for RM scenarios. I'm currently doing some tweaks to this > >> implementation and when completed I'll commit the code in. > >> > >> I agree with your idea about making mediators say whether they want to > >> access the message content or not. Basically I had to implement this as > a > >> part of the above mentioned POC. However I did it by adding a new > method to > >> the Mediator interface (isContentAware). Each mediator returns > true/false > >> depending on what they do and how they are configured. For an example > <log/> > >> will return false where as <log level="full"/> will return true. <xslt/> > >> will always return true. <filter/> will return true/false depending on > the > >> type of XPath expression used. This way we tackle the problem in a more > >> elegant and flexible manner without involving the user. I think using > >> properties for this purpose is a hack and will be a hassle to the users. > >> > >> With the above implementation applied to your proxy configuration, > message > >> will be built by the SOAPBuilder when it hits the filter mediator (due > to > >> the XPath). On the out sequence, neither the builder nor the formatter > will > >> get engaged, and the message will be simply passed through Synapse at > the > >> transport level. > >> > >> I also like your idea about implementing a more efficient XPath engine > that > >> only builds a part of the message. That's something we have lacked for a > >> while > >> > >> Thanks, > >> Hiranya > >> > >> [2] - > >> http://old.nabble.com/Message-Relay-Support-for-Synapse-to33693068.html > >> > >> > >> On Wed, Sep 12, 2012 at 9:01 AM, Amila Suriarachchi > >> <amilasuriarach...@gmail.com> wrote: > >>> > >>> hi all, > >>> > >>> For SOAP message based content based routing, currently we use > SOAPBuilder > >>> and SOAPMessageFormater to build the soap envelop and serialize it. But > >>> however in the content based routing the only message part required to > read > >>> is the parts that has the content need for routing. On the other hand > there > >>> is no need to build the response xml message if no mediation required > for > >>> response. > >>> > >>> Therefore we can make this perform better with the following steps. > First > >>> at the message builder level we create a buffered input stream to > buffer the > >>> read message and set this as a message context property. Then at the > synapse > >>> engine level we can copy this bufferedInput stream to out message > context. > >>> Now at the out message context we can access the buffered input stream > and > >>> use that to directly serialize the message from the input stream after > >>> resetting the input stream. > >>> > >>> I have created the related patch here[1]. With this patch I could > improve > >>> the TPS for the following proxy services with 10k message from 1,700.7 > to > >>> 12,135.48 (25% gain). > >>> > >>> > >>> <proxy name="CBRProxy" transports="https http" startOnLoad="true"> > >>> > >>> <target> > >>> > >>> <inSequence> > >>> > >>> <property name="passThroughProxy" value="true" scope="default" > >>> type="STRING"/> > >>> > >>> <filter xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" > >>> source="//order[1]/symbol" regex="IBM"> > >>> > >>> <then> > >>> > >>> <send> > >>> > >>> <endpoint key="RealService"/> > >>> > >>> </send> > >>> > >>> </then> > >>> > >>> <else> > >>> > >>> <makefault version="soap11"> > >>> > >>> <code xmlns:sf11="http://schemas.xmlsoap.org/soap/envelope/" > >>> value="sf11:Server"/> > >>> > >>> <reason value="First order must be for the symbol IBM"/> > >>> > >>> </makefault> > >>> > >>> <header name="To" action="remove"/> > >>> > >>> <property name="RESPONSE" value="true"/> > >>> > >>> <send/> > >>> > >>> </else> > >>> > >>> </filter> > >>> > >>> </inSequence> > >>> > >>> </target> > >>> > >>> <publishWSDL key="ProxyWSDL-embedded.wsdl"/> > >>> > >>> </proxy> > >>> > >>> > >>> Here are the other improvements can be done for this method. > >>> > >>> Here user have to set whether it is a pass through proxy or not using a > >>> property mediator. However we can use some mechanism where each synapse > >>> mediator set a property if that change the incoming message. If the > message > >>> has not been changed that can be pass through like this. > >>> > >>> I have used buffered Input stream here. We may write a custom Input > stream > >>> reader to perform this job better. > >>> > >>> Currently Axiom xpath build the whole soap envelope. Therefore if we > can > >>> write an axiom xpath engine which only builds the required parts > performance > >>> can be further improved. > >>> > >>> I have created the patch basically demonstrate the concept. There can > be > >>> more efficient way of implementing as well. > >>> > >>> WDTY? > >>> > >>> Thanks, > >>> > >>> Amila. > >>> > >>> [1] https://issues.apache.org/jira/browse/SYNAPSE-909 > >>> > >>> > >>> > >>> -- > >>> Amila Suriarachchi > >>> WSO2 Inc. > >>> blog: http://amilachinthaka.blogspot.com/ > >> > >> > >> > >> > >> -- > >> Hiranya Jayathilaka > >> Mayhem Lab/RACE Lab; > >> Dept. of Computer Science, UCSB; http://cs.ucsb.edu > >> E-mail: hira...@cs.ucsb.edu; Mobile: +1 (805) 895-7443 > >> Blog: http://techfeast-hiranya.blogspot.com > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: dev-unsubscr...@synapse.apache.org > > For additional commands, e-mail: dev-h...@synapse.apache.org > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: dev-unsubscr...@synapse.apache.org > For additional commands, e-mail: dev-h...@synapse.apache.org > > -- Amila Suriarachchi WSO2 Inc. blog: http://amilachinthaka.blogspot.com/