tag:blogger.com,1999:blog-43148239436758914752024-03-12T23:59:44.882-07:00Enterprise Service Bus (ESB) MagicMagic with the UltraESB!Asankhahttp://www.blogger.com/profile/05768379677233692797noreply@blogger.comBlogger66125tag:blogger.com,1999:blog-4314823943675891475.post-32117327149683672942017-02-07T07:19:00.000-08:002017-02-07T07:19:57.963-08:00AdroitLogic Announces Major New Release of UltraESB with an Enterprise Integration Platform and Developer Studio<div dir="ltr" style="text-align: left;" trbidi="on">
A short while ago, we <a href="http://www.globenewswire.com/NewsRoom/ReleaseNg/1487738" target="_blank">announced</a> a major update to the UltraESB Enterprise Service Bus, called the UltraESB-X release. This is a rewrite of our <a href="https://www.adroitlogic.com/products/ultraesb/" target="_blank">high performance UltraESB Enterprise Service Bus</a> run-time, on top of a new modular framework code-named <a href="http://developer.adroitlogic.org/project-x/docs/17-01/project-x/" target="_blank">Project-X</a>. The new release retains the performance benefits
introduced by the UltraESB, supporting HTTP/S exchanges with
zero-copy data transfers and Non-blocking IO (NIO). This
performance edge prompted Walmart to license our technology in 2013 to power its new
integration platform; and for Kuoni GTA to support over half
a billion requests per day, with its B2B travel API, since
2014.<br />
We also released the <a href="http://adroitlogic.com/products/ultrastudio/" rel="nofollow" target="_blank">UltraStudio</a>, a rich
integration solution development studio to increase
developer productivity. It enriches the end-to-end
experience of integration development with powerful
extensions and plugins to the popular IntelliJ IDEA IDE. The
UltraStudio allows users to develop integration flows with a
drag-and-drop palette of connectors and processors, and helps
to <a href="http://sajith.me/2017/01/12/introducing-ultrastudio/" target="_blank">test, debug and trace integration flows</a> through the
execution path, and view properties at each stage. The palette of connectors and processors keeps increasing, and its a simple effort to develop custom connectors and message processors, by end users. The <a href="https://www.youtube.com/watch?v=OSjfSwMv0Xo" target="_blank">YouTube video</a> linked from Sajiths blog shows this in action.<br />
<br />
The new <a href="https://adroitlogic.com/products/ips/" rel="nofollow" target="_blank">Integration Platform</a>
announced today, offers integration capabilities as a
service, over private, public or hybrid cloud based <a href="http://www.docker.com/" target="_blank">Docker</a>
containers, utilizing the <a href="http://kubernetes.io/" target="_blank">Kubernetes</a> framework for managing
the run-time and availability. The Integration Platform
becomes available as an on-demand service to multiple
organizational units within an enterprise, allowing users to
target different UltraESB-X deployments with varying
availability requirements, over a set of shared physical
resources. The platform manages the deployments and
automatically repairs failed instances, guaranteeing
availability and stability. In the event of a container failure, the incarnation details of the instance is retained to allow troubleshooting of the root cause, and the container instances thus retain state in an otherwise stateless container deployment to facilitate management. The metrics of each UltraESB-X
runtime are reported to ElasticSearch which then powers a
consolidated management and monitoring dashboard that
manages the platform.<br />
<br />
Try out the new products from our <a href="http://adroitlogic.com/" target="_blank">website</a>, and the integration resources, samples and documentation from the new Developer site at <a href="http://developer.adroitlogic.org/">http://developer.adroitlogic.org</a> </div>
Asankha Pererahttp://www.blogger.com/profile/17313699161300739449noreply@blogger.com0tag:blogger.com,1999:blog-4314823943675891475.post-46248852234366241662017-01-19T03:32:00.002-08:002017-01-19T04:36:05.798-08:00Happy 7th Birthday AdroitLogic and UltraESB!<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlK8E5wjRdXOeDZSjJXbQYc1C9FsvhgtjP5EAmFhfBxzoGEoh2k8J3zhHVeh341APJ3FHSD3A4GImdriPw-od2C1As45WFQ2wz44gVxvR-sEEDKdAYYPLHAQ2-4lYdl4xeWcO_CARcyo8/s1600/adroitlogic-square-transparent.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="275" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlK8E5wjRdXOeDZSjJXbQYc1C9FsvhgtjP5EAmFhfBxzoGEoh2k8J3zhHVeh341APJ3FHSD3A4GImdriPw-od2C1As45WFQ2wz44gVxvR-sEEDKdAYYPLHAQ2-4lYdl4xeWcO_CARcyo8/s320/adroitlogic-square-transparent.png" width="320" /></a></div>
Today marks 7 years since the first public announcement from AdroitLogic about its core product, the UltraESB Enterprise Service Bus!<br />
<br />
We've completed yet another year of success, and we are very close to releasing our upcoming products for 2017, the new UltraStudio with the UltraESB-X runtime, and the Integration Platform Server (IPS). The UltraStudio is a new Integrated Development Environment for the development, testing and deployment of integration flows into the new UltraESB-X runtime. The graphical user interface based on the worlds best IDE, IntelliJ IDEA, allows users to implement integration solutions faster and easier. The Integration Platform (IPS), based on Kubernetes and Docker, is able to
deploy highly available integration services across a cluster, managed
as a collection of lightweight containers. The services can be deployed on private, public and hybrid clouds as well. We will soon be releasing these new products, with an update to our web site and documentation, and also introduce a new developer site to help integration engineers use our products and solutions more easily.<br />
<br />
During the past year, we've also increased our team size, and five more engineers have confirmed employment with us within next few months. And as we planned an year back, we successfully purchased our own property in March last year, and will now embark on setting up and moving into our own new office this year.<br />
<br />
We look forward to yet another exciting year ahead, and believe that our efforts have enhanced the solutions for Enterprise Integration challenges, to many organizations across the world!</div>
Asankha Pererahttp://www.blogger.com/profile/17313699161300739449noreply@blogger.com0tag:blogger.com,1999:blog-4314823943675891475.post-29206907477346747722016-01-17T11:20:00.000-08:002016-01-17T11:20:39.935-08:00AdroitLogic and the UltraESB is 6 years!<div dir="ltr" style="text-align: left;" trbidi="on">
The 19th of January 2016 marks 6 years since the UltraESB was first announced publicly; It also marks the completion of six years of success for AdroitLogic!<br />
<br />
The last year was an exciting one, with our team size increasing more than two fold.. As a side effect, we've now run out of space and are actively looking for alternate locations to move into; with one of the possibilities being to purchase our own property and build our office the way we want.<br />
<br />
On the technical front, we've developed the Enterprise Middleware Framework (EMW) last year, and deployed it in production, along with the IMonitor enhanced management console with detailed statistics and management capabilities with an Elastic Search back-end. Our core products are now available with Ansible based scripts for auto installation and configuration, including the configuration of large clusters - making the deployments easier for our customers. These enhancements will be made available to more customers this year, and detailed information about the EMW Framework, IMonitor and the Ansible scripts made publicly available.<br />
<br />
The APIDirector and the AS2Gateway too have kept gaining traction over the past year, and we've now started investing in our Integration Platform as a Service endeavor, which is based on Containers. This would be the key product to be introduced during this coming year, along with our next major update with a secret project, currently code named 'X'.<br />
<br />
We plan to start more aggressive marketing and sales activities, with enhanced web sites and documentation, and introduce a new Customer Portal to assist our customers with more valuable content and up-to date information. It will certainly be an exciting year ahead!</div>
Asankha Pererahttp://www.blogger.com/profile/17313699161300739449noreply@blogger.com0tag:blogger.com,1999:blog-4314823943675891475.post-18628905048183558932015-10-05T22:11:00.001-07:002015-10-05T22:11:11.995-07:00Understading Oracle Query Performance Tuning and using Indexes for optimizations<div dir="ltr" style="text-align: left;" trbidi="on">
Sometime back we had a suspected issue with the performance of an Oracle query. Although the issue was found to be unrelated to the suspicion, we did investigate the issue and was able to further improve the performance based on the analysis performed.<br />
<br />
To list indexes already existing on a table, you can login as SYSDBA and execute the following. From a Linux workstation, this would mean:<br />
<span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;"><br /></span></span>
<span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;">[user@host ~]$ sudo su - oracle<br />-bash-4.1$ sqlplus / as sysdba</span></span><br />
<br />
From within SQLPlus, execute:<br />
<span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;">set pages 999<br />set lin 999<br /><br />break on table_name skip 2<br /><br />column table_name format a25<br />column index_name format a25<br />column column_name format a25<br /><br />select<br /> table_name,<br /> index_name,<br /> column_name<br />from<br /> dba_ind_columns<br />where<br /> table_owner='APS_ESB'<br />order by<br /> table_name,<br /> column_position;</span></span><br />
<br />
<br />
The output will list each table and the indexes<br />
<br />
<span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;">TABLE_NAME INDEX_NAME COLUMN_NAME<br />------------------- --------------------- -------------------------<br />...<br />DELIVERY_INFO DELIVERY_INFO_PK MSG_REF</span></span><br />
<span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;">...</span></span><br />
<span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;"></span></span><br />By default, Oracle will only create an index for the primary key of a table.<br />
<br />
<br />
<br /><br />
To understand how a query is analyzed and performed by Oracle, use the "EXPLAIN PLAN FOR " prefix before your SQL query to analyze. Then after SQLPlus outputs "Explained", issue the query "SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY());" as shown below<br />
<br />
<span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;">SQL> EXPLAIN PLAN FOR SELECT MSG_REF FROM SCHEMA.PERF_DELIVERY_INFO WHERE ST_STAGE IN (4, 6) AND ((ST_SUBSYS0_STATE < 2 AND (ST_SUBSYS0_UPDATE_TIME IS NULL OR ST_SUBSYS0_UPDATE_TIME < TO_TIMESTAMP ('19-Mar-15 10:03:10.123000', 'DD-Mon-RR HH24:MI:SS.FF'))) OR (ST_SUBSYS1_STATE < 2 AND (ST_SUBSYS1_UPDATE_TIME IS NULL OR ST_SUBSYS1_UPDATE_TIME < TO_TIMESTAMP ('19-Mar-15 10:03:10.123000', 'DD-Mon-RR HH24:MI:SS.FF'))) OR (ST_SUBSYS2_STATE < 2 AND (ST_SUBSYS2_UPDATE_TIME IS NULL OR ST_SUBSYS2_UPDATE_TIME < TO_TIMESTAMP ('19-Mar-15 10:03:10.123000', 'DD-Mon-RR HH24:MI:SS.FF'))) OR (ST_SUBSYS3_STATE < 2 AND (ST_SUBSYS3_UPDATE_TIME IS NULL OR ST_SUBSYS3_UPDATE_TIME < TO_TIMESTAMP ('19-Mar-15 10:03:10.123000', 'DD-Mon-RR HH24:MI:SS.FF'))) OR (ST_SUBSYS4_STATE < 2 AND (ST_SUBSYS4_UPDATE_TIME IS NULL OR ST_SUBSYS4_UPDATE_TIME < TO_TIMESTAMP ('19-Mar-15 10:03:10.123000', 'DD-Mon-RR HH24:MI:SS.FF'))) OR (ST_SUBSYS8_STATE < 2 AND (ST_SUBSYS8_UPDATE_TIME IS NULL OR ST_SUBSYS8_UPDATE_TIME < TO_TIMESTAMP ('19-Mar-15 10:03:10.123000', 'DD-Mon-RR HH24:MI:SS.FF'))) OR (ST_SUBSYS9_STATE < 2 AND (ST_SUBSYS9_UPDATE_TIME IS NULL OR ST_SUBSYS9_UPDATE_TIME < TO_TIMESTAMP ('19-Mar-15 10:03:10.123000', 'DD-Mon-RR HH24:MI:SS.FF'))) OR (ST_SUBSYS10_STATE < 2 AND (ST_SUBSYS10_UPDATE_TIME IS NULL OR ST_SUBSYS10_UPDATE_TIME < TO_TIMESTAMP ('19-Mar-15 10:03:10.123000', 'DD-Mon-RR HH24:MI:SS.FF'))) OR (ST_SUBSYS11_STATE < 2 AND (ST_SUBSYS11_UPDATE_TIME IS NULL OR ST_SUBSYS11_UPDATE_TIME < TO_TIMESTAMP ('19-Mar-15 10:03:10.123000', 'DD-Mon-RR HH24:MI:SS.FF'))) OR (ST_SUBSYS5_STATE < 2 AND (ST_SUBSYS5_UPDATE_TIME IS NULL OR ST_SUBSYS5_UPDATE_TIME < TO_TIMESTAMP ('19-Mar-15 10:03:10.123000', 'DD-Mon-RR HH24:MI:SS.FF'))) OR (ST_SUBSYS6_STATE < 2 AND (ST_SUBSYS6_UPDATE_TIME IS NULL OR ST_SUBSYS6_UPDATE_TIME < TO_TIMESTAMP ('19-Mar-15 10:03:10.123000', 'DD-Mon-RR HH24:MI:SS.FF'))) OR (ST_SUBSYS7_STATE < 2 AND (ST_SUBSYS7_UPDATE_TIME IS NULL OR ST_SUBSYS7_UPDATE_TIME < TO_TIMESTAMP ('19-Mar-15 10:03:10.123000', 'DD-Mon-RR HH24:MI:SS.FF')))) AND ROWNUM < 101 ORDER BY LAST_RECV_TIME;<br /><br />Explained.<br /><br />SQL> SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY());<br /><br />PLAN_TABLE_OUTPUT<br />------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------<br />Plan hash value: 1365086006<br /><br />--------------------------------------------------------------------------------------------------<br />| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |<br />--------------------------------------------------------------------------------------------------<br />| 0 | SELECT STATEMENT | | 100 | 6400 | | 2622 (2)| 00:00:32 |<br />| 1 | SORT ORDER BY | | 100 | 6400 | 968K| 2622 (2)| 00:00:32 |<br />|* 2 | COUNT STOPKEY | | | | | | |<br />|* 3 | <b>TABLE ACCESS FULL</b>| PERF_DELIVERY_INFO | <b>7763</b> | 485K| | <b>2499</b> (2)| <b>00:00:30</b> |<br />--------------------------------------------------------------------------------------------------<br /><br />Predicate Information (identified by operation id):<br />---------------------------------------------------<br /><br /> 2 - filter(ROWNUM<101)<br /> 3 - filter(("ST_STAGE"=4 OR "ST_STAGE"=6) AND ("ST_SUBSYS0_STATE"<2 AND<br /> ("ST_SUBSYS0_UPDATE_TIME" IS NULL OR "ST_SUBSYS0_UPDATE_TIME"<TO_TIMESTAMP('19-Mar-15<br /> 10:03:10.123000','DD-Mon-RR HH24:MI:SS.FF')) OR "ST_SUBSYS1_STATE"<2 AND<br /> ("ST_SUBSYS1_UPDATE_TIME" IS NULL OR "ST_SUBSYS1_UPDATE_TIME"<TO_TIMESTAMP('19-Mar-15<br /> 10:03:10.123000','DD-Mon-RR HH24:MI:SS.FF')) OR "ST_SUBSYS2_STATE"<2 AND<br /> ("ST_SUBSYS2_UPDATE_TIME" IS NULL OR "ST_SUBSYS2_UPDATE_TIME"<TO_TIMESTAMP('19-Mar-15<br /> 10:03:10.123000','DD-Mon-RR HH24:MI:SS.FF')) OR "ST_SUBSYS3_STATE"<2 AND<br /> ("ST_SUBSYS3_UPDATE_TIME" IS NULL OR "ST_SUBSYS3_UPDATE_TIME"<TO_TIMESTAMP('19-Mar-15<br /> 10:03:10.123000','DD-Mon-RR HH24:MI:SS.FF')) OR "ST_SUBSYS4_STATE"<2 AND<br /> ("ST_SUBSYS4_UPDATE_TIME" IS NULL OR "ST_SUBSYS4_UPDATE_TIME"<TO_TIMESTAMP('19-Mar-15<br /> 10:03:10.123000','DD-Mon-RR HH24:MI:SS.FF')) OR "ST_SUBSYS8_STATE"<2 AND<br /> ("ST_SUBSYS8_UPDATE_TIME" IS NULL OR "ST_SUBSYS8_UPDATE_TIME"<TO_TIMESTAMP('19-Mar-15<br /> 10:03:10.123000','DD-Mon-RR HH24:MI:SS.FF')) OR "ST_SUBSYS9_STATE"<2 AND<br /> ("ST_SUBSYS9_UPDATE_TIME" IS NULL OR "ST_SUBSYS9_UPDATE_TIME"<TO_TIMESTAMP('19-Mar-15<br /> 10:03:10.123000','DD-Mon-RR HH24:MI:SS.FF')) OR "ST_SUBSYS10_STATE"<2 AND<br /> ("ST_SUBSYS10_UPDATE_TIME" IS NULL OR "ST_SUBSYS10_UPDATE_TIME"<TO_TIMESTAMP('19-Mar-15<br /> 10:03:10.123000','DD-Mon-RR HH24:MI:SS.FF')) OR "ST_SUBSYS11_STATE"<2 AND<br /> ("ST_SUBSYS11_UPDATE_TIME" IS NULL OR "ST_SUBSYS11_UPDATE_TIME"<TO_TIMESTAMP('19-Mar-15<br /> 10:03:10.123000','DD-Mon-RR HH24:MI:SS.FF')) OR "ST_SUBSYS5_STATE"<2 AND<br /> ("ST_SUBSYS5_UPDATE_TIME" IS NULL OR "ST_SUBSYS5_UPDATE_TIME"<TO_TIMESTAMP('19-Mar-15<br /> 10:03:10.123000','DD-Mon-RR HH24:MI:SS.FF')) OR "ST_SUBSYS6_STATE"<2 AND<br /> ("ST_SUBSYS6_UPDATE_TIME" IS NULL OR "ST_SUBSYS6_UPDATE_TIME"<TO_TIMESTAMP('19-Mar-15<br /> 10:03:10.123000','DD-Mon-RR HH24:MI:SS.FF')) OR "ST_SUBSYS7_STATE"<2 AND<br /> ("ST_SUBSYS7_UPDATE_TIME" IS NULL OR "ST_SUBSYS7_UPDATE_TIME"<TO_TIMESTAMP('19-Mar-15<br /> 10:03:10.123000','DD-Mon-RR HH24:MI:SS.FF'))))</span></span><br />
<br />
<br />
As we can see above, a full table scan will occur if we do not have any indexes over the columns over which any rows will be filtered. After creating an index over the columns of significance, we can now analyze the performance again with "EXPLAIN PLAN FOR .." and the same query now executes with:<br />
<br />
<span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;">-------------------------------------------------------------------------------------------<br />| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |<br />-------------------------------------------------------------------------------------------<br />| 0 | SELECT STATEMENT | | 100 | 6400 | 10 (0)| 00:00:01 |<br />|* 1 | COUNT STOPKEY | | | | | |<br />|* 2 | <b>INDEX FULL SCAN</b>| PERF_DELIVERY_INFO_IDX | 7763 | 485K| <b>10</b> (0)| <b>00:00:01</b> |<br />-------------------------------------------------------------------------------------------</span></span><br />
<br />
As we can see, a simple index created to correctly support a query can increase the performance many folds. In the example above, the table scan was replaced with a scan only over the index, which is much more efficient in CPU usage and time.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br /></div>
Asankha Pererahttp://www.blogger.com/profile/17313699161300739449noreply@blogger.com0tag:blogger.com,1999:blog-4314823943675891475.post-61280481299586446902015-09-22T03:24:00.001-07:002015-09-22T03:24:05.331-07:00Ansible installation on RedHat RHEL server with RPM packages<div dir="ltr" style="text-align: left;" trbidi="on">
<a href="http://www.ansible.com/" target="_blank">Ansible</a> is a great tool for DevOps automation. At AdroitLogic, we recently initiated a drive to create Ansible based installation scripts for all of our enterprise product versions. Now an UltraESB cluster can be setup in a matter of minutes by configuring the inventory for the different components that makes up the system. A post on this will come shortly!<br />
<br />
However, today we addressed the issue of installing Ansible on a RHEL machine without Internet access. This is a requirement for one of our customers. Unfortunately the <a href="http://docs.ansible.com/ansible/intro_installation.html" target="_blank">Ansible installation instructions</a> does not include steps on how to install the product with raw RPMs on a hardened system without Internet access.<br />
<br />
1. Install the YUM download plugin<br />
<br />
[root@emw01 ~]# yum install yum-plugin-downloadonly<br />
<br />
2. Make a directory to "capture" the packages<br />
<br />
[root@emw01 ~]# mkdir /tmp/ansible<br />
<br />
<br />
3. Proceed with YUM install with following options<br />
<br />[root@emw01 ~]# yum install --downloadonly --downloaddir=/tmp/ansible/ ansible<br />
<br />
4. The above step will download all of the required libraries and components to the directory /tmp/ansible. You can now copy these files onto your target system, and install each of the packages as listed below. Since some of the components may depend on others, you may need to tweak the order of components if you are installing a different version of Ansible on a RHEL version other than 6.6<br />
<br />
rpm -ivh libyaml-0.1.3-4.el6_6.x86_64.rpm <br />rpm -ivh PyYAML-3.10-3.1.el6.x86_64.rpm <br />rpm -ivh python-babel-0.9.4-5.1.el6.noarch.rpm <br />rpm -ivh python-crypto-2.0.1-22.el6.x86_64.rpm <br />rpm -ivh python-crypto2.6-2.6.1-2.el6.x86_64.rpm <br />rpm -ivh python-pyasn1-0.0.12a-1.el6.noarch.rpm <br />rpm -ivh python-paramiko-1.7.5-2.1.el6.noarch.rpm <br />rpm -ivh python-setuptools-0.6.10-3.el6.noarch.rpm <br />rpm -ivh python-simplejson-2.0.9-3.1.el6.x86_64.rpm <br />rpm -ivh python-jinja2-2.2.1-2.el6_5.x86_64.rpm <br />rpm -ivh python-httplib2-0.7.7-1.el6.noarch.rpm <br />rpm -ivh python-keyczar-0.71c-1.el6.noarch.rpm <br />rpm -ivh ansible-1.9.2-1.el6.noarch.rpm <br />
</div>
Asankhahttp://www.blogger.com/profile/05768379677233692797noreply@blogger.com6tag:blogger.com,1999:blog-4314823943675891475.post-11922070597083461702015-08-18T00:10:00.000-07:002015-08-18T00:10:27.580-07:00Connecting to local Coherence instance with WKA instead of Multicast<div dir="ltr" style="text-align: left;" trbidi="on">
I have been trying to setup a test environment for a local Coherence cache implementation for sometime, and the information found via Google was not that helpful in understanding why the client application (in this case the UltraESB) was not connecting to the already created Coherence cluster using WKA, and was trying to create its own cluster with Multicast.<br />
<br />
The System properties I passed to the JVM included the following, but the issue was not necessarily on these as I found out with my limited knowledge of Coherence.<br />
<br />
<b>The key lesson was - the System properties being correct was not enough for WKA to function properly!</b><br />
<blockquote class="tr_bq">
<span style="font-size: x-small;">wrapper.java.additional.13=-Dtangosol.coherence.cluster=adrt-cluster<br />wrapper.java.additional.14=-Dtangosol.coherence.management=all <br />wrapper.java.additional.15=-Dtangosol.coherence.cacheconfig=coherence/xxxx-cache-config.xml<br />wrapper.java.additional.16=-Dtangosol.coherence.localhost=127.0.0.1<br />wrapper.java.additional.17=-Dtangosol.coherence.localport=15000<br />wrapper.java.additional.18=-Dtangosol.coherence.wka.address=127.0.0.1<br />wrapper.java.additional.19=-Dtangosol.coherence.wka.port=15000<br />wrapper.java.additional.20=-Dtangosol.coherence.ttl=0<br />wrapper.java.additional.21=-Dtangosol.coherence.distributed.localstorage=false</span></blockquote>
<br />
The solution was to create a new file "tangosol-coherence-override.xml" and place it in the classpath (make sure its at the start to get picked up before any others - if any)<br />
<br />
<blockquote class="tr_bq">
<span style="font-size: x-small;"><?xml version='1.0'?>
<br /><coherence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<br /> xmlns="http://xmlns.oracle.com/coherence/coherence-operational-config"
<br /> xsi:schemaLocation="http://xmlns.oracle.com/coherence/coherence-operational-config coherence-operational-config.xsd">
<br /><br /> <cluster-config>
<br /> <unicast-listener>
<br /> <well-known-addresses><br /> <socket-address id="1"><br /> <address>127.0.0.1</address><br /> <port>15000</port><br /> </socket-address><br /> </well-known-addresses><br /> <address>127.0.0.1</address><br /> <port>15000</port>
<br /> </unicast-listener>
<br /> </cluster-config>
<br /><br /> <logging-config>
<br /> <severity-level system-property="tangosol.coherence.log.level">9</severity-level>
<br /> <character-limit system-property="tangosol.coherence.log.limit">0</character-limit>
<br /> </logging-config>
<br /></coherence></span></blockquote>
<br />
If your client "connects" to the WKA cluster you will see the following, and you can notice that it connected to an already existing cluster with a different process<br />
<br />
<b>WellKnownAddressList</b>(Size=1,<br /> WKA{Address=127.0.0.1, Port=15000}<br /> )<br />
MasterMemberSet(<br /> <b>ThisMember</b>=Member(Id=3, Timestamp=2015-08-18 12:24:32.153, Address=127.0.0.1:15002, MachineId=60314, Location=site:,machine:localhost,process:<b>5634</b>)<br /> <b>OldestMember</b>=Member(Id=1, Timestamp=2015-08-18 12:24:07.652, Address=127.0.0.1:15000, MachineId=60314, Location=site:,machine:localhost,process:<b>5366</b>, Role=CoherenceServer) <br />
<br />
And if it didn't connect with WKA, and created its own Multicast group you would see the following, where you can also notice that the client you just started is the only member of that new cluster<br />
<br />
<b>Group</b>{Address=224.12.1.0, Port=12100, TTL=0}<br />
MasterMemberSet(<br /> <b>ThisMember</b>=Member(Id=1, Timestamp=2015-08-18 10:25:08.389, Address=127.0.0.1:15002, MachineId=60314, Location=site:,machine:localhost,process:<b>4278</b>)<br /> <b>OldestMember</b>=Member(Id=1, Timestamp=2015-08-18 10:25:08.389, Address=127.0.0.1:15002, MachineId=60314, Location=site:,machine:localhost,process:<b>4278</b>)</div>
Asankha Pererahttp://www.blogger.com/profile/17313699161300739449noreply@blogger.com0tag:blogger.com,1999:blog-4314823943675891475.post-70487663695368063892015-01-18T18:15:00.001-08:002015-01-18T18:15:57.529-08:00How the UltraESB and AdroitLogic was born..The UltraESB and AdroitLogic was born 5 years ago today! In my personal blog, I have captured some of the history behind starting this up! <br /><br />
<br /><br />
<a href="http://asankha.blogspot.com/2015/01/how-ultraesb-and-adroitlogic-was-born.html?spref=bl">The "personal" blog of Asankha Perera: How the UltraESB and AdroitLogic was born..</a>Asankha Pererahttp://www.blogger.com/profile/17313699161300739449noreply@blogger.com0tag:blogger.com,1999:blog-4314823943675891475.post-1808219849506813702014-11-11T20:55:00.000-08:002014-11-11T20:55:36.283-08:00AdroitLogic Recognized in DZone’s 2014 Guide to Enterprise Integration<div dir="ltr" style="text-align: left;" trbidi="on">
<style type="text/css">P { margin-bottom: 0.08in; }A:link { }</style>
<br />
<div style="margin-bottom: 0in;">
</div>
<div style="margin-bottom: 0in;">
<br /></div>
<div style="margin-bottom: 0in;">
We are very excited to be recognized as
a featured vendor in DZone’s 2014 <i>Guide to Enterprise
Integration</i>, a premium resource focused on enterprise integration
and API management trends, strategies, and tools. The guide includes
topic introductions, expert opinions, best practices, and solution
comparisons. </div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJLTNcdzjLiYuGzU8O2u7FxEGf39BFisKXwYhRl4YEA7do5Vy3rfR6LM8WREkD4JyG__BDTui3RaMaTdF8OJyQ_rNfzuLbNxlijHeoNDg-rS5ugL6IAJb8XPbeqMt-a1TDWtW5i88BXE4/s1600/DZR_EnterpriseIntegration_VendorButton.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJLTNcdzjLiYuGzU8O2u7FxEGf39BFisKXwYhRl4YEA7do5Vy3rfR6LM8WREkD4JyG__BDTui3RaMaTdF8OJyQ_rNfzuLbNxlijHeoNDg-rS5ugL6IAJb8XPbeqMt-a1TDWtW5i88BXE4/s1600/DZR_EnterpriseIntegration_VendorButton.png" /></a></div>
<div style="margin-bottom: 0in;">
<br /></div>
<div style="margin-bottom: 0in;">
<br />
</div>
<div style="margin-bottom: 0in;">
Readers of the guide will get an
overview of enterprise integration and learn about obstacles that
developers are facing to create seamless integration. Topics covered
by the guide include:</div>
<ul>
<li><div style="margin-bottom: 0in;">
The role of message queues,
middleware, and ESBs in the enterprise.</div>
</li>
<li><div style="margin-bottom: 0in;">
Decomposition patterns for
breaking down monolithic architecture.</div>
</li>
<li><div style="margin-bottom: 0in;">
A model for understanding the
maturity level of REST APIs.</div>
</li>
<li><div style="margin-bottom: 0in;">
A forecast of how building a large
project with multiple integrations might look in the future.</div>
</li>
</ul>
<div style="margin-bottom: 0in;">
</div>
<div style="margin-bottom: 0in;">
DZone’s Enterprise Integration guide
also offers key insights into integration and API management
practices through a survey of 500+ developers and experts, allowing
readers to learn trends from practitioners in the technology
professional community. Additionally, the guide’s solutions
directory compares different API management platforms, integration
suites, ESBs, message queues, and integration frameworks to help
readers wisely choose the solutions they need.
</div>
<div style="margin-bottom: 0in;">
<br />
</div>
<div style="margin-bottom: 0in;">
Readers can <a href="http://dzone.com/research/guide-to-enterprise-integration?utm_source=AdroitLogic&utm_medium=Blog&utm_campaign=EI%20Guide" target="_blank">download a free copy of the guide</a> here:
</div>
<div style="margin-bottom: 0in;">
</div>
<div style="margin-bottom: 0in;">
<br /></div>
<div style="margin-bottom: 0in;">
<span style="font-size: x-small;"><b>About DZone</b></span></div>
<div style="margin-bottom: 0in;">
<span style="font-size: x-small;">DZone provides expert
research and learning communities for developers, tech professionals,
and smart people everywhere. DZone has been a trusted, global source
of content for over 15 years. </span>
</div>
<div style="margin-bottom: 0in;">
<br />
</div>
</div>
Asankha Pererahttp://www.blogger.com/profile/17313699161300739449noreply@blogger.com0tag:blogger.com,1999:blog-4314823943675891475.post-55878368864855518852014-04-10T10:14:00.000-07:002014-04-10T10:34:28.242-07:00Build better software, and the world will still beat a path to your door!<div dir="ltr" style="text-align: left;" trbidi="on">
Yesterday I was pleasantly surprised to read an <a href="http://blogs.wsj.com/digits/2014/04/08/atlassian-valued-at-3-3-billion-selling-business-software-sans-salespeople/" target="_blank">article on the WSJ</a>, that Atlassian was recently valued at $3.3B, and has sold $150M worth of its equity in a secondary sale mostly for the benefit of some of its long time employees.<br />
<br />
I first got to know about Atlassian after using the JIRA issue tracker - which they had kindly made available to the Apache Software Foundation projects. It was a great product to use, and every developer I knew who had used it, simply loved it and would promote it without any hesitation wherever they went.<br />
<br />
After leaving full time employment in late 2008, I bought my first couple of licenses for JIRA to help support some of the customers I was helping as a freelance consultant. Another great thing about Atlassian is that they help smaller companies at just $10 a piece for most of these really cool products under their <a href="https://www.atlassian.com/software/starter/overview" target="_blank">Starter Program</a>. Even the $10 goes to the Room to Read charity, and the startup licenses have already contributed more than $3M for charity!<br />
<br />
After starting my own entrepreneurial career a few years back, I started to admire Atlassian even more. They actually bootsrapped that great company. I've read so many articles about them, and listened to the talk '<a href="http://www.youtube.com/watch?v=gixLVBMok2o" target="_blank">Art of the BootStrap</a>' by the co-founders, where they share many great insights about the bootstrapping process and the rise of Atlassian. Like GitHub, they didn't go looking for funding, but instead focussed on building great products that would sell themselves - due to great experiences the users had, and the resulting feedback and word of mouth referrals. When GitHub bootstrapped, they <a href="http://tom.preston-werner.com/2010/10/18/optimize-for-happiness.html" target="_blank">Optimized for Happiness</a>, since they were happy to build things of value, than about writing business plans with make believe numbers. This also allowed them to throw away things like financial projections, hard deadlines, ineffective executives that make investors feel safe, and everything that hindered employees from building amazing products.<br />
<br />
Something even more interesting to know about Atlassian is that they do not employ any sales folks - and with the money they save, the company invests heavily on research and development. Farquhar states that "<i>Fifteen years ago, as long as you had the best distribution you would win</i>". "<i>It didn’t matter whether Oracle was worse than SAP. These days, people are making decisions based on how good the products are</i>" - which is really true. This is the same sentiment I read on the ReadWrite.com article "<a href="http://readwrite.com/2014/04/07/open-source-software-cost-recruiting-participation#awesm=~oAUbhJ8xiPNL6h" target="_blank">The Reasons Businesses Use Open Source Are Changing Faster Than You Realize</a>"<br />
<br />
Large enterprises now realize that good Open Source products have great quality behind them, although they may cost significantly less than competition. And the ability to have the source code, and modify it really means that the user can extend a product even if the vendor developing or supporting it does not want to do that for you. I'd leave you to read through the slides from "<a href="http://www.slideshare.net/blackducksoftware/2014-future-of-open-source-survey-results" target="_blank">2014 - The future of Open Source</a>", and possibly the web cast of the panel discussion with Michael Skok et al. Today 8 out of 10 choose Open Source for <a href="http://www.adroitlogic.org/about.html" target="_blank">Quality</a>.<br />
<br />
Atlassian too allows any of its licensed users to download the source code - if they are interested in it. Although I've never had to do that, I feel privileged to have this option available to me - if I ever needed it. I'm sure many of you would have used quite expensive commercial software from very large companies that we all know of. Although these companies spent possibly millions of dollars, that does not make their software bug free. Many years back, I was at a client to install a leading RDBMS from an unopened box that contained the software the client purchased. However, to my surprise I found that to install that database version in that unopened box, I first had to get a service pack applied :) I seriously think that having access to the source code - even for closed proprietary software, is a great thing, since many end-users can innovate faster than some of the large companies can enhance their own products. Open source projects attract features and great ideas from many enterprise architects who use them, and these ideas turn up to be great features to sell to future customers - who are seriously happy to see such features - as they too values them very much.<br />
<br />
Last year, a recent Fortune #1 company with ~$450 Billion in revenue selected the UltraESB, when many commercial ESBs, as well as open source alternatives existed on the market, which they could easily afford. This was after extensive analysis of our technical strengths, product stability and code quality all turned up with great results. Like Atlassian, we do not have a sales team either, but only a really strong engineering and support team and a great product that simply finds itself around, including to the top of the Fortune list of companies. We never approached any of our current customers; instead, they all found us. It was like what Emerson said, "Build a better mousetrap, and the world will beat a path to your door"<br />
<br />
Earlier this year, we had a similar POC where we were shortlisted against a competitor with well over a hundred million dollars in funding. Again, we were selected on the technical merits, and also since we had handled the customer relationship better than how the sales team of our competitor could. When a potential customer talks to us, he talks directly to those who had written the code, installed it at many enterprises around the world, and who helped many clients before with similar and real problems. Quite obviously, no sales team can beat that - especially when the customer understands technology.<br />
<br />
We have exciting times ahead of us now, and a great list of <a href="http://www.adroitlogic.org/customers.html" target="_blank">customers</a> already utilizing our software in production, in addition to the recent Fortune #1.<br />
<br />
So later this year, we will be looking forward to talk to those who believe in us, our journey so far, and our potential to take on the world. Fortunately, we will have the freedom to make a wise and informed selection, as until now, we've certainly optimized for happiness and for passion!<br />
<br />
<b style="color: black; font-weight: 400;"></b></div>
Asankha Pererahttp://www.blogger.com/profile/17313699161300739449noreply@blogger.com1tag:blogger.com,1999:blog-4314823943675891475.post-85481883024791560722014-04-07T23:14:00.001-07:002014-04-07T23:14:42.453-07:00UltraESB 2.2.0 GA Released!<div dir="ltr" style="text-align: left;" trbidi="on">
We've just released the v2.2.0 of the UltraESB, and you can find the news release <a href="http://www.adroitlogic.org/news/news-07-04-14.html" target="_blank">here</a>.<br />
<br />
This release stabilizes some of the deployment aspects introduced in the 2.0 and 2.1 releases, and allows the externalization of some of the aspects for easier management and control. The release also fixes some defects related to classloading from deployment units, and also introduces a few changes to the public API to make the ESB API more user friendly and intuitive.<br />
<br />
The release also adds support for the FIX (Financial Information Exchange) transport utilizing the QuickFixJ open source FIX library, and supports JSONPath - similar to XPath for XML payloads. We have also begun to move common utility functions to UTerm, and as a first step, the UTerm now includes the ability to run the JavaBench (clone of Apache Bench) load testing client easily from the command line, with repeated testing capabilities.<br />
<br />
You can download the latest release as usual from http://www.adroitlogic.org/download.html </div>
Asankha Pererahttp://www.blogger.com/profile/17313699161300739449noreply@blogger.com0tag:blogger.com,1999:blog-4314823943675891475.post-74053151738360081492013-11-07T03:38:00.000-08:002013-11-07T03:41:03.017-08:00Nausea with Tomcat after biting too much?<div dir="ltr" style="text-align: left;" trbidi="on">
About an year back I wrote a post "<a href="http://esbmagic.blogspot.com/2012/10/does-tomcat-bite-more-than-it-can-chew.html" target="_blank">Does Tomcat bite more than it can chew</a>" about how Tomcat accepts more TCP connections that it can handle, and resets them later on. I also wrote a follow-up post "<a href="http://esbmagic.blogspot.com/2012/11/how-to-stop-biting-when-you-cant-chew.html" target="_blank">How to stop biting, when you cant chew more..</a>" and explained how the <a href="http://www.adroitlogic.org/" target="_blank">UltraESB</a> does it using Apache <a href="http://hc.apache.org/" target="_blank">HttpComponents NIO</a> underneath. I raised the issue on the Tomcat mailing list too, but found that most of the folks over there did not like what I had to say, and refused to change Tomcat.<br />
<br />
This week one of our clients was running a load test using the UltraESB in front of a Tomcat instance, and wanted to measure the performance of the UltraESB to use WS-Security signatures over a Tomcat service. However, at 1000 concurrent users, the UltraESB started to report an XML parse exception with a "Premature end of file" for the responses.<br />
<br />
After detailed investigations to reproduce the issue in our environment, we found the culprit to be Tomcat. However, proof of the issue was not that simple, and we used a standalone Java client to issue fixed sized asynchronous HTTP post requests to Tomcat, and measured the size of the responses received. The message size used was 5120 bytes, and thus a response of equal size was expected.<br />
<br />
However, under load, Tomcat accepted a 5K request, but replied with an HTTP status code of 200, but without any payload. It sent the Content-Length header value as "0". Here is what Wireshark reported:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtPycT_77ytRqioosPM0f1iASN2MncCJTMLosxOvoHyh3r7Sf8zMqtvILldCmdoGHrZpllytUS_NnxY_ZOSZvlGxauc_FHaFYjeY6zTpiHxQmIXNU9XtZNgPHxNqgEdAsPcxBwt9t8K08/s1600/tomcat-failure.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="337" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtPycT_77ytRqioosPM0f1iASN2MncCJTMLosxOvoHyh3r7Sf8zMqtvILldCmdoGHrZpllytUS_NnxY_ZOSZvlGxauc_FHaFYjeY6zTpiHxQmIXNU9XtZNgPHxNqgEdAsPcxBwt9t8K08/s640/tomcat-failure.png" width="640" /></a></div>
Here are the response headers that Tomcat sent back:<br />
<blockquote class="tr_bq">
HTTP/1.1 200 OK
<br />
Server: Apache-Coyote/1.1
<br />
Content-Length: 0
<br />
Date: Thu, 07 Nov 2013 10:15:14 GMT
<br />
Connection: close
</blockquote>
It's also interesting to note that Tomcat sometimes returns error responses which states that an internal error occurred; but with a HTTP status code of 200, instead of the expected 500 error code. Here is an example of such a payload returned: <br />
<blockquote class="tr_bq">
<html><head><title>Apache Tomcat/7.0.28 - Error report</title><style><!--H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}A.name {color : black;}HR {color : #525D76;}--></style> </head><body><h1><span style="color: red;">HTTP Status 500</span> - </h1><HR size="1" noshade="noshade"><p><b>type</b> Status report</p><p><b>message</b> <u></u></p><p><b>description</b> <u><span style="color: red;">The server encountered an internal error () that prevented it from fulfilling this request</span>.</u></p><HR size="1" noshade="noshade"><h3>Apache Tomcat/7.0.28</h3></body></html></blockquote>
It would have been so much better for many, if Tomcat did not bite fast, when it cannot chew! </div>
Asankha Pererahttp://www.blogger.com/profile/17313699161300739449noreply@blogger.com2tag:blogger.com,1999:blog-4314823943675891475.post-41286850032409529762013-10-14T07:56:00.002-07:002013-10-14T07:56:51.192-07:00ESB Performance Testing - Round 7 Published!<div dir="ltr" style="text-align: left;" trbidi="on">
We have just published the results for the long awaited <a href="http://esbperformance.org/display/comparison/ESB+Performance+Testing+-+Round+7" target="_blank">Round 7</a> - of ESB performance benchmarking. This round compares 4 of the leading free and open source ESBs, Mule CE 3.4.0, Talend ESB SE 5.3.1, WSO2 ESB 4.7.0 and the UltraESB 2.0.0<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-79ZS9M9Ho6DQEVRldKm1O1-9u43v2JCA44odigO-vFzno6xV9snUPHPh_ao3hlc94R83CzgeunWYG5r4y0yCJAucpFeOPXDUz9-6WsSST_-_ZlenMP2HW6G6Wh4CrPwHL45phIiAksE/s1600/esb_performance_round_7_summary.png.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="192" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-79ZS9M9Ho6DQEVRldKm1O1-9u43v2JCA44odigO-vFzno6xV9snUPHPh_ao3hlc94R83CzgeunWYG5r4y0yCJAucpFeOPXDUz9-6WsSST_-_ZlenMP2HW6G6Wh4CrPwHL45phIiAksE/s320/esb_performance_round_7_summary.png.jpeg" width="320" /></a></div>
Although at first glance the above image may indicate that the WSO2 ESB and the UltraESB have very similar performance characteristics, the Devil is indeed in the detail.<br />
<br />
During the testing we discovered several issues with the previously published article <a href="http://wso2.com/library/articles/2013/01/esb-performance-65/" target="_blank">Round 6.5</a> from WSO2, including a severe response corruption for messages over 16,384 bytes when the default pass-through transport is being used. However, what's most surprising is that this issue remains in versions 4.6.0 and 4.7.0 of the WSO2 ESB, as well as the latest Milestone 4 of the soon to be released version 4.8.0.<br />
<br />
Sadly, the WSO2 engineers conducting the Round 6.5 also failed to notice a complete failure of all of the XSLT test cases, but nevertheless published numbers obtained for the failed test cases as high performance numbers over the other ESBs.<br />
<br />
Read about these and other flaws of the Round 6.5 in the article <a href="http://esbperformance.org/display/comparison/Why+the+Round+6.5+results+published+by+WSO2+is+flawed" target="_blank">Why the Round 6.5 results published by WSO2 is flawed</a></div>
Asankha Pererahttp://www.blogger.com/profile/17313699161300739449noreply@blogger.com6tag:blogger.com,1999:blog-4314823943675891475.post-24710774798220521252013-08-27T11:14:00.000-07:002013-08-27T11:14:40.496-07:00UltraESB 2.0.0 is released!<div dir="ltr" style="text-align: left;" trbidi="on">
Yeah, its been quite sometime since we did a major release of the UltraESB! Although the last GA release was extremely stable and widely used, we've made significant improvements for the long awaited 2.0.0 release.<br />
<br />
Since the beginning, we have been privileged to work closely with some of the best architects actually using our software in production. The suggestions and improvements proposed by them helped us implement key features that set the UltraESB apart. These were real requirements that meant a lot for large scale production deployments running 24 x 7 x 365 with zero downtime. For the 2.0.0 release, we've implemented many features that have been similarly inspired by the requirements of a top Fortune #10 company. These include a built-in metrics management and alerting functionality, and a programmatic instance management capability - coupled with annotation driven extensibility, especially for custom message interception at various stages.<br />
<br />
Ruwan has already blogged about some of the <a href="http://blog.ruwan.org/2013/06/new-in-ultraesb-20-metrics-and.html" target="_blank">metrics graphs</a> generated by the UConsole in the 2.0.0 release, and you could find more documentation at <a href="http://docs.adroitlogic.org/">http://docs.adroitlogic.org</a> The 2.0.0 release also migrates to Apache HttpComponents/Core 4.2.4 and Spring framework / Spring security 3.1.1 and introduces a concept of a 'Deployment Unit' that can be deployed/updated or removed at runtime. Deployment units now has the ability to re-load dependency JAR files into the runtime as well, and support atomic updates as before, which allows all changes to be deployed into ESB nodes servicing client requests - without causing inconsistencies.<br />
<br />
The Mediation API has also been cleaned up and streamlined with the introduction of 'Support Interfaces'. While being backwards compatible, the changes will help users utilize the UltraESB mediation API more easily.<br />
<br />
Check out the full news release <a href="http://www.adroitlogic.org/news/news-27-08-13.html" target="_blank">here</a>, and refer to the <a href="http://docs.adroitlogic.org/" target="_blank">documentation</a> to get started!</div>
Asankhahttp://www.blogger.com/profile/05768379677233692797noreply@blogger.com0tag:blogger.com,1999:blog-4314823943675891475.post-71791782714393480642013-02-23T10:52:00.000-08:002013-02-23T20:10:20.415-08:00What drives talent out?<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: justify;">
A few days back I saw the famous presentation from <a href="http://www.slideshare.net/reed2001/culture-1798664" target="_blank">Netflix</a> about its culture, and three interesting slides from it was about what drives talent out of a company. </div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<img border="0" height="236" src="https://fbcdn-sphotos-e-a.akamaihd.net/hphotos-ak-prn1/13155_10151268909268837_1376810304_n.jpg" width="320" /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://fbcdn-sphotos-d-a.akamaihd.net/hphotos-ak-ash4/382268_10151268910098837_1999280393_n.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="238" src="https://fbcdn-sphotos-d-a.akamaihd.net/hphotos-ak-ash4/382268_10151268910098837_1999280393_n.jpg" width="320" /></a><a href="https://fbcdn-sphotos-a-a.akamaihd.net/hphotos-ak-ash3/529165_10151268912488837_1744718328_n.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="238" src="https://fbcdn-sphotos-a-a.akamaihd.net/hphotos-ak-ash3/529165_10151268912488837_1744718328_n.jpg" width="320" /></a></div>
<br />
Today I came across a poster created by <a data-hovercard="/ajax/hovercard/page.php?id=159649794155306" href="https://www.facebook.com/hichchi.koluwa" id="js_11">හිච්චි කොලුවා</a> which shows another aspect from a more Sri Lankan point of view, and it says its the 'තිත්ත ඇත්ත' .. interesting points to think about!<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://fbcdn-sphotos-a-a.akamaihd.net/hphotos-ak-ash3/c0.0.600.286.83274021352/p843x403/602084_334640059989611_522221394_n.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><br /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://fbcdn-sphotos-a-a.akamaihd.net/hphotos-ak-ash3/602084_334640059989611_522221394_n.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://fbcdn-sphotos-a-a.akamaihd.net/hphotos-ak-ash3/602084_334640059989611_522221394_n.jpg" width="274" /></a></div>
<br />
PS: If you aim the moon, believe that you WILL get there. If a planes' limit is the clouds.. get onto a rocket.. do not deviate from achieving your goal!</div>
Asankhahttp://www.blogger.com/profile/05768379677233692797noreply@blogger.com0tag:blogger.com,1999:blog-4314823943675891475.post-71452072663957542442012-11-05T23:46:00.001-08:002012-11-05T23:46:16.821-08:00How to stop biting, when you cant chew more..<div dir="ltr" style="text-align: left;" trbidi="on">
This is a follow up to my earlier post '<a href="http://esbmagic.blogspot.com/2012/10/does-tomcat-bite-more-than-it-can-chew.html" target="_blank">Does Tomcat bite more than it can chew?</a>' and illustrates a pure Java program that utilizes Java NIO to stop accepting new messages when one is not able to handle the load, without any dependence on the TCP backlog etc.<br />
<br />
<h3 style="text-align: left;">
Program Implementation</h3>
We open a selector, and invoke the startListening() method, that opens a ServerSocketChannel and then binds it to port 8280. The channel is configured as non-blocking, and finally we register our interest in <a href="http://docs.oracle.com/javase/6/docs/api/java/nio/channels/SelectionKey.html#OP_ACCEPT" target="_blank">OP_ACCEPT</a> to handle incoming connections.<br />
<br />
<span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;"> private void startListening() throws IOException {<br /> server = ServerSocketChannel.open();<br /> server.socket().bind(new InetSocketAddress(8280), 0);<br /> server.configureBlocking(false);<br /> server.register(selector, SelectionKey.OP_ACCEPT);<br /> System.out.println("\nI am ready to listen for new messages now..");<br /> }</span></span><br />
<br />
If you telnet to the port via a command line after the server starts up, you would see a message "Hi there! type a word". The server accepts the incoming connection as a non-blocking connection, and registers OP_READ to read the content typed in.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-oame5P659c6TnSakakDx-MITslqy_q5C9MNMVz0Hle1XqCKwkOa7c20JZochW0Efz2-XKHMvs1WK4tcJILJMz8NNT4NUdLXq9BhldP9n197obIoLSkW7dnekrqZnWjaxcbVZGgzr6vU/s1600/asankha@asankha-dm4:+~_001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="121" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-oame5P659c6TnSakakDx-MITslqy_q5C9MNMVz0Hle1XqCKwkOa7c20JZochW0Efz2-XKHMvs1WK4tcJILJMz8NNT4NUdLXq9BhldP9n197obIoLSkW7dnekrqZnWjaxcbVZGgzr6vU/s200/asankha@asankha-dm4:+~_001.png" width="200" /></a></div>
<br />
<br />
To illustrate how the server can prevent another client from connecting to it while it serves the currently connected client, it prints "I accepted this one.. but not any more now" on its console, cancels the SelectionKey and closes the channel.<br />
<br />
A new telnet session will see the "Connection refused" error as expected.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEc32Sdu99fFROv9BUmzeWhTP32Kg3-qbZz1xn7rwsZTUKXX4pze27mzrfh6RUZLKhgLwDEcty1E4cMOMvb9tCkI5AGmfG-TyNId3xBSIdTBPcx4YhBFc1aO9CLVpEmwjNAumdXyx5XIc/s1600/asankha@asankha-dm4:+~_002.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="129" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEc32Sdu99fFROv9BUmzeWhTP32Kg3-qbZz1xn7rwsZTUKXX4pze27mzrfh6RUZLKhgLwDEcty1E4cMOMvb9tCkI5AGmfG-TyNId3xBSIdTBPcx4YhBFc1aO9CLVpEmwjNAumdXyx5XIc/s200/asankha@asankha-dm4:+~_002.png" width="200" /></a></div>
<br />
Next, I would type a small word into the first telnet session, and the server would print it in its console, and close the connection.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiC067oZkGE9f-hqpJZby9XBqZvrH3NaPpdrcBwFHits97Y1IeHdeBLbmJD_yw3tk1ptDztI7VqEZ6_6iOnuEMWQoxbPAlOgQhiggkIgwsrBK5ankvK0zT3MBuFuLE6QTaOC9iKQ8oWLa8/s1600/asankha@asankha-dm4:+~_003.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="129" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiC067oZkGE9f-hqpJZby9XBqZvrH3NaPpdrcBwFHits97Y1IeHdeBLbmJD_yw3tk1ptDztI7VqEZ6_6iOnuEMWQoxbPAlOgQhiggkIgwsrBK5ankvK0zT3MBuFuLE6QTaOC9iKQ8oWLa8/s200/asankha@asankha-dm4:+~_003.png" width="200" /></a></div>
<br />
At the same time, it prints the message "I am ready to listen for new messages now.." on its console, and invokes the above startListening() method again - making it ready to listen and accept a new client.<br />
<br />
We re-try the connection from the same command prompt that received the 'Connection refused' earlier, and as expected are greeted with the welcome message again.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzIBAtQhWNlYm-oMwk_qhqefOaXsd41N-raBnvRNaq4IUj8LSmDfvbRkmY7ohEfukSS0FZ5BsiM9miiol_2siHxZqflfJlyCzi8gHOfjpci0LJZzQYouOPLj6ZxwTecygdGLHT_9QJLgY/s1600/asankha@asankha-dm4:+~_004.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="129" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzIBAtQhWNlYm-oMwk_qhqefOaXsd41N-raBnvRNaq4IUj8LSmDfvbRkmY7ohEfukSS0FZ5BsiM9miiol_2siHxZqflfJlyCzi8gHOfjpci0LJZzQYouOPLj6ZxwTecygdGLHT_9QJLgY/s200/asankha@asankha-dm4:+~_004.png" width="200" /></a></div>
<h3 style="text-align: left;">
What did we learn?</h3>
A low level NIO server can stop accepting new connections, if it can determine that its not able to serve new clients. Once it stops accepting connections this way, any client connection attempt will see a 'Connection Refused' error. This may not be the case if our server was implemented differently (See my last article and its example and how Tomcat behaves under load).<br />
<br />
<h3 style="text-align: left;">
Complete source code</h3>
<span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;">import java.io.IOException;<br />import java.net.InetSocketAddress;<br />import java.nio.ByteBuffer;<br />import java.nio.channels.SelectionKey;<br />import java.nio.channels.Selector;<br />import java.nio.channels.ServerSocketChannel;<br />import java.nio.channels.SocketChannel;<br />import java.util.Iterator;<br /><br />public class TestAccept2 {<br /><br /> private ServerSocketChannel server = null;<br /> private Selector selector = null;<br /><br /> public static void main(String[] args) throws Exception {<br /> new TestAccept2().run();<br /> }<br /><br /> private void run() throws Exception {<br /> selector = Selector.open();<br /> startListening();<br /><br /> while (true) {<br /> selector.select();<br /><br /> for (Iterator<selectionkey> i = selector.selectedKeys().iterator(); i.hasNext(); ) {<br /> SelectionKey key = i.next();<br /> i.remove();<br /> if (key.isAcceptable()) {<br /> SocketChannel client = server.accept();<br /> client.configureBlocking(false);<br /> client.socket().setTcpNoDelay(true);<br /> client.register(selector, SelectionKey.OP_READ);<br /><br /> System.out.println("I accepted this one.. but not any more now");<br /> key.cancel();<br /> key.channel().close();<br /> sayHello(client);<br /><br /> } else if (key.isReadable()) {<br /> readDataFromSocket(key);<br /> }<br /> }<br /> }<br /> }<br /><br /> private void startListening() throws IOException {<br /> server = ServerSocketChannel.open();<br /> server.socket().bind(new InetSocketAddress(8280), 0);<br /> server.configureBlocking(false);<br /> server.register(selector, SelectionKey.OP_ACCEPT);<br /> System.out.println("\nI am ready to listen for new messages now..");<br /> }<br /><br /> private void sayHello(SocketChannel channel) throws Exception {<br /> channel.write(ByteBuffer.wrap("Hi there! type a word\r\n".getBytes()));<br /> }<br /><br /> private void readDataFromSocket(SelectionKey key) throws Exception {<br /> SocketChannel socketChannel = (SocketChannel) key.channel();<br /> ByteBuffer buffer = ByteBuffer.allocate(32);<br /> if (socketChannel.read(buffer) > 0) {<br /> buffer.flip();<br /> byte[] bytearr = new byte[buffer.remaining()];<br /> buffer.get(bytearr);<br /> System.out.print(new String(bytearr));<br /> socketChannel.close();<br /><br /> startListening();<br /> }<br /> }<br /><br />}</selectionkey></span></span><br />
<br /></div>
Asankhahttp://www.blogger.com/profile/05768379677233692797noreply@blogger.com2tag:blogger.com,1999:blog-4314823943675891475.post-57717481248523812252012-10-31T21:55:00.002-07:002012-10-31T21:55:29.402-07:00Does Tomcat bite more than it can chew?<div dir="ltr" style="text-align: left;" trbidi="on">
<div dir="ltr" style="text-align: left;" trbidi="on">
<div dir="ltr" style="text-align: left;" trbidi="on">
This is an interesting blog post for me, since its about the root cause for an issue we saw with Tomcat back in <a href="http://markmail.org/message/v7cpj6oqumtn5gtp" target="_blank">May 2011</a>, which remained unresolved. Under high concurrency and load, Tomcat would reset (i.e. TCP level RST) client connections, without refusing to accept them - as one would expect. I posted this again to the Tomcat user list a <a href="http://markmail.org/message/wajap37zjnakzmc2" target="_blank">few days back</a>, but then wanted to find out the root cause for myself, since it would surely come up again in the future.<br />
<br />
<h3 style="text-align: left;">
Background</h3>
This issue initially became evident when we ran high concurrency load tests at a customer location in Europe, where the customer had back-end services deployed on multiple Tomcat instances, and wanted to use the UltraESB for routing messages with load balancing and fail-over. For the <a href="http://www.esbperformance.org/" target="_blank">ESB Performance Benchmark</a>, we had been using an EchoService written over the Apache HttpComponents/Core NIO library that scaled extremely well and behaved well at the TCP level, even under load. However, at the client site, they wanted the test run against real services deployed on Tomcat - to analyse a more realistic scenario. We used a Java based clone of ApacheBench called the 'Java Bench' which is also a part of the Apache HttpComponents project, to generate load. The client would go up-to concurrency levels of 2560, pushing as many messages as possible through the ESB, to back end services deployed over Tomcat.<br />
<br />
Under high load, the ESB would start to see errors while talking to Tomcat, and the cause would be IO errors such as "Connection reset by peer". Now the problem to the ESB is that it had already started to send out an HTTP request / payload over an accepted TCP connection, and thus it does not know if it can fail-over safely by default to another node, since the backend service might have performed some processing over the request it may have already received. Of-course, the ESB could be configured to retry on such errors as well, but our default behaviour was to fail-over only on the safer connection refused or connect timeout errors (i.e. a connection could not be established within the allocated time) - which ensures correct operation, even for non-idempotent services.<br />
<br />
<h3 style="text-align: left;">
Recent Observations</h3>
We recently experienced the same issue with Tomcat when a customer wanted to perform a load test scenario where a back-end service would block for 1-5 seconds randomly, to simulate realistic behaviour. Here, again we saw that Tomcat was resetting accepted TCP connections, and we were able to capture this with Wireshark as follows, using JavaBench directly against a Tomcat based <a href="https://bitbucket.org/adroitlogic/esbperformance/src/3648d6bc41a00a40865297b4ec1be2424f8d8efd/echo/src/main/java/samples/services/http/EchoService.java?at=default" target="_blank">servlet</a><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsC1h5Uh33yzupeJILABoexnJZijQyoc0SUrqifQaIsViOMM6KLcJJY9g4wWEPiuuBiarXFMer-VR4md-sDf0IAKrdb7VatbjCoUCYUtdGiR7liSrASgaDsZYVTdH_cfMI-srS4xtesZI/s1600/wireshark-capture-tomcat-tcp-reset.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="337" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsC1h5Uh33yzupeJILABoexnJZijQyoc0SUrqifQaIsViOMM6KLcJJY9g4wWEPiuuBiarXFMer-VR4md-sDf0IAKrdb7VatbjCoUCYUtdGiR7liSrASgaDsZYVTdH_cfMI-srS4xtesZI/s640/wireshark-capture-tomcat-tcp-reset.jpg" width="640" /></a></div>
<br />
As can be seen in the trace, the client initiated a TCP connection with the source port 9386, and Tomcat running on port 9000 accepted the connection - note “1”. The client kept sending packets of a 100K request, and Tomcat kept acknowledging them. The last such case is annotated with note “2”. Note that the request payload was not complete at this time from the client – note “3”. Suddenly, Tomcat resets the connection – note “4”<br />
</div>
<h3 style="text-align: left;">
Understanding the root cause</h3>
After failing to locate any code in the Tomcat source code that resets established connections, I wanted to simulate the behaviour with a very simple Java program. Luckily the problem was easy to reproduce with a simple program as follows:<br />
<br />
<span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;">import java.net.ServerSocket;<br />import java.net.Socket;<br /><br />public class TestAccept1 {<br /><br /> public static void main(String[] args) throws Exception {<br /> ServerSocket serverSocket = new ServerSocket(8280, 0);<br /> Socket socket = serverSocket.accept();<br /> Thread.sleep(3000000); // do nothing<br /> }<br />}</span></span><br />
<br />
We just open a server socket on port 8280, with a backlog of 0 and start listening for connections. Since the backlog is 0, one could assume that only one client connection would be allowed - BUT, I could open more than that via telnet as follows, and even send some data afterwards by typing it in and pressing the enter key.<br />
<br />
<span style="font-family: "Courier New",Courier,monospace;"><span style="font-size: x-small;">telnet localhost 8280</span></span><br />
<span style="font-family: "Courier New",Courier,monospace;"><span style="font-size: x-small;">hello world</span></span><br />
<br />
A netstat command now confirms that more than one connection is opene:<br />
<span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;"><br /></span></span>
<span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;">netstat -na | grep 8280 </span></span><br />
<span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;">tcp 0 0 127.0.0.1:34629 127.0.0.1:8280 ESTABLISHED</span></span><br />
<span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;">tcp 0 0 127.0.0.1:34630 127.0.0.1:8280 ESTABLISHED</span></span><br />
<span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;">tcp6 0 0 :::8280 :::* LISTEN </span></span><br />
<span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;">tcp6 13 0 127.0.0.1:8280 127.0.0.1:34630 ESTABLISHED</span></span><br />
<span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;">tcp6 13 0 127.0.0.1:8280 127.0.0.1:34629 ESTABLISHED</span></span><br />
<br />
However, the Java program has only accepted ONE socket, although at the OS level, two would appear. It seems like the OS also allows more than two connections to be opened, even when the backlog is specified as 0. On Ubuntu 12.04 x64, the netstat command would not show me the actual listen queue length - but I believe it was not 0. However, before and after this test, I did not see a difference in the reported statistics for "listen queue" overflow, which I could see with the "netstat -sp tcp | fgrep listen" command<br />
<br />
Next I used the JavaBench from the <a href="http://docs.adroitlogic.org/display/esb/SOA+Toolbox" target="_blank">SOA ToolBox</a> and issued a small payload at concurrency 1024, with a single iteration against the same port 8280<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXMbHXAieI-2k7CBHaP4vErr7rTzJFooAaFVDkyEmGEmlCGYJwm0_Ss4s0Q9oI-Ttoy2hVh_7gbCRrZSQzsRt-lfUTrEN_HOWwfcR6ZSfvMXO-vd4q-6zzRk4xvXgfYtsySks386dDfpI/s1600/AdroitLogic+ToolBox+for+UltraESB_001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="169" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXMbHXAieI-2k7CBHaP4vErr7rTzJFooAaFVDkyEmGEmlCGYJwm0_Ss4s0Q9oI-Ttoy2hVh_7gbCRrZSQzsRt-lfUTrEN_HOWwfcR6ZSfvMXO-vd4q-6zzRk4xvXgfYtsySks386dDfpI/s320/AdroitLogic+ToolBox+for+UltraESB_001.png" width="320" /></a></div>
<br />
As expected, all requests failed, but my Wireshark trace on port 8280 did not detect any connection resets. Pushing the concurrency to 2560 and the iterations to 10 started to show tcp level RSTs - which were similar to those seen on Tomcat, though not exactly the same.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkuzRpzV_KoDo2WWu6M5N-ouAqiw0hfRl7R01unWkfyYzuhotsBNGhqwoVXu5VomJVa6FOUJnAGo-3MLmWLoxFM_4aVkd17I-zNgjxyYsiphJx_O5IseR5urp2hag9lNsUEOcLYICsyAQ/s1600/AdroitLogic+ToolBox+for+UltraESB_002.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="169" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkuzRpzV_KoDo2WWu6M5N-ouAqiw0hfRl7R01unWkfyYzuhotsBNGhqwoVXu5VomJVa6FOUJnAGo-3MLmWLoxFM_4aVkd17I-zNgjxyYsiphJx_O5IseR5urp2hag9lNsUEOcLYICsyAQ/s320/AdroitLogic+ToolBox+for+UltraESB_002.png" width="320" /></a></div>
<h3>
</h3>
<h3>
Can Tomcat do better?</h3>
Yes, Possibly .. What an end user would expect from Tomcat is that it refuses to accept new connections when under load, and not to accept connections and then reset them halfway through. But one would ask if that is achievable? Especially considering the behaviour seen with the simple Java example we discussed.<br />
<br />
Well, the solution could be to perform better handling of the low level HTTP connections and the sockets, and this is already done by the free and open source high performance Enterprise Service Bus <a href="http://www.adroitlogic.org/" target="_blank">UltraESB</a>, which utilizes the excellent <a href="http://hc.apache.org/" target="_blank">Apache HttpComponents</a> project underneath.<br />
<br />
<h3 style="text-align: left;">
How does the UltraESB behave</h3>
One could easily test this by using the 'stopNewConnectionsAt' property of our NIO listener. If you set it to 2, you wont be able to even open a Telnet session to the socket beyond 2.<br />
<bean class="org.adroitlogic.ultraesb.transport.http.HttpNIOListener" id="http-8280"><constructor-arg ref="fileCache"> </constructor-arg></bean></div>
<br />
The first would work, the second too<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrhQ6ZXeJDnEiOs9AEhrkI9LY7DzkonPpSVjr-J7_w8dXgu_9gVWrTzhujpTLUjyiEK7ysrBwpkKLTNTGZq1OTWqNHexcCrOgTZyCius3_qcANfccsejF3WOkPEHFu5layRY_NBdoZ8xQ/s1600/asankha@asankha-dm4:+~_003.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="207" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrhQ6ZXeJDnEiOs9AEhrkI9LY7DzkonPpSVjr-J7_w8dXgu_9gVWrTzhujpTLUjyiEK7ysrBwpkKLTNTGZq1OTWqNHexcCrOgTZyCius3_qcANfccsejF3WOkPEHFu5layRY_NBdoZ8xQ/s320/asankha@asankha-dm4:+~_003.png" width="320" /></a></div>
But the third would see a "Connection refused"<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsxC1EwkEg_whQQBn4trWlcrrgjFR5ko8p1Bp_dfiS2wMUbJnBsQaaPf2gassirN62yO66zVegXPDIJ-jtykS1Il6KaAlPXSicailvdlYWIDTW5KD-7r5OkUWusOB_-sAW7Rq6L8Ryd_s/s1600/asankha@asankha-dm4:+~_004.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="207" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsxC1EwkEg_whQQBn4trWlcrrgjFR5ko8p1Bp_dfiS2wMUbJnBsQaaPf2gassirN62yO66zVegXPDIJ-jtykS1Il6KaAlPXSicailvdlYWIDTW5KD-7r5OkUWusOB_-sAW7Rq6L8Ryd_s/s320/asankha@asankha-dm4:+~_004.png" width="320" /></a></div>
And the UltraESB would report the following on its logs:<br />
<br />
<span style="font-family: "Courier New",Courier,monospace;"><span style="font-size: x-small;"> INFO HttpNIOListener HTTP Listener http-8280 paused </span></span><br />
<span style="font-family: "Courier New",Courier,monospace;"><span style="font-size: x-small;"> WARN HttpNIOListener$EventLogger Enter maintenance mode as open connections reached : 2</span></span><br />
<br />
Although it refuses to accept new connections, already accepted connections executes without any hindrance to completion. Thus a hardware level load balancer in front of an UltraESB cluster can safely load balance if an UltraESB node is loaded beyond its configured limits, without having to deal with any connection resets. Once a connection slot becomes free, the UltraESB will start accepting new connections as applicable.<br />
<br />
<h3 style="text-align: left;">
Analysing a corresponding TCP dump</h3>
To analyse the corresponding behaviour, we wrote a simple Echo proxy service on the UltraESB, that also slept for 1 to 5 seconds before it replied, and tested this with the same JavaBench under 2560 concurrent users, each trying to push 10 messages in iteration.<br />
<br />
Out of the 25600 requests, 7 completed successfully, while 25593 failed, as expected. We also saw many tcp level RSTs on the Wireshark dump - which must have been issued by the underlying operating system.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdOYg_aYso9oSsCAz2z3aw-kwMKv6BI1W7kD-iSwvkkIcJFTjwTdvjBYHUtYzSKPKfNzrvIYXhbR-nRyjnzJeQZa74QbfCDVwYz8vFvn3Fa8dGvqmqc60Dzk37lZtGUlhQk2DdbR9Z1HQ/s1600/Capturing+from+lo+(port+8280)+_003.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="408" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdOYg_aYso9oSsCAz2z3aw-kwMKv6BI1W7kD-iSwvkkIcJFTjwTdvjBYHUtYzSKPKfNzrvIYXhbR-nRyjnzJeQZa74QbfCDVwYz8vFvn3Fa8dGvqmqc60Dzk37lZtGUlhQk2DdbR9Z1HQ/s640/Capturing+from+lo+(port+8280)+_003.png" width="640" /></a></div>
<br />
However, what's interesting to note is the difference - the RSTs occur immediately on receiving the SYN packet from the client - and are not established HTTP or TCP connections, but elegant "Connection Refused" errors - which would be what the client can expect. Thus the client can safely fail-over to another node without any doubt, overhead or delay.<br />
<br />
<h3 style="text-align: left;">
Appendix : Supporting high concurrency in general</h3>
During testing we also saw that the Linux OS could detect the opening of many concurrent connections at the same time as a <a href="http://en.wikipedia.org/wiki/SYN_flood" target="_blank">SYN flood</a> attack, and then start using SYN cookies. You would see messages such as
<br />
-->
<br />
<div align="JUSTIFY" class="western" style="margin-bottom: 0in; margin-left: 0.49in;">
Possible SYN flooding on port 9000. Sending cookies</div>
<br />
displayed
on the output of a "sudo dmesg", if this happens. Hence, for a real
load, it would be better to disable SYN cookies by turning it off as
follows as the root user<br />
-->
<br />
<div align="JUSTIFY" class="western" style="margin-bottom: 0in; margin-left: 0.49in;">
# echo 0 > /proc/sys/net/ipv4/tcp_syncookies</div>
<br />
To make the change persist over reboots, add the following line to your /etc/sysctl.conf<br />
-->
<br />
<div align="JUSTIFY" class="western" style="margin-bottom: 0in; margin-left: 0.49in;">
net.ipv4.tcp_syncookies = 0</div>
<br />
To
allow the Linux OS to accept more connections, its also recommended
that the 'net.core.somaxconn' be increased - as it usually defaults to
128 or so. This could be performed by the root user as follows,<br />
--><br />
<div align="JUSTIFY" class="western" style="margin-bottom: 0in; margin-left: 0.49in;">
# echo 1024 > /proc/sys/net/core/somaxconn</div>
<br />
To persist the change, append the following to the /etc/sysctl.conf<br />
-->
<br />
<div align="JUSTIFY" class="western" style="margin-bottom: 0in; margin-left: 0.49in;">
net.core.somaxconn = 1024</div>
<br />
<br />
<h3 style="text-align: left;">
Kudos!</h3>
The UltraESB could not have behaved gracefully without the support of the underlying <a href="http://hc.apache.org/" target="_blank">Apache HttpComponents</a> library, and the help and support received from that project community, especially by <a href="http://www.linkedin.com/pub/oleg-kalnichevski/0/66a/b92" target="_blank">Oleg Kalnichevski</a> - whose code and help has always fascinated me!<br />
<br />
<br />
<br /></div>
Asankha Pererahttp://www.blogger.com/profile/17313699161300739449noreply@blogger.com2tag:blogger.com,1999:blog-4314823943675891475.post-59461026360211956452012-09-07T11:55:00.000-07:002012-09-07T11:55:46.264-07:00<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9CKOgRCngwkdV7lVyGlTq4rMpFuE1VSxCeZqjOKvpO1b9fsu632AQkrmYkdupV_UvykwkCfqgRodtPsTkslFLFZLjAVskFiovchx_D_XT5vuCEbTDhd1HCGfo3cmOomGfXMWrWjFCQyE/s1600/adroitlogic-is-hiring.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9CKOgRCngwkdV7lVyGlTq4rMpFuE1VSxCeZqjOKvpO1b9fsu632AQkrmYkdupV_UvykwkCfqgRodtPsTkslFLFZLjAVskFiovchx_D_XT5vuCEbTDhd1HCGfo3cmOomGfXMWrWjFCQyE/s640/adroitlogic-is-hiring.png" width="640" /></a></div>
<br />Asankhahttp://www.blogger.com/profile/05768379677233692797noreply@blogger.com0tag:blogger.com,1999:blog-4314823943675891475.post-37321276943929876872012-08-23T23:32:00.002-07:002012-08-24T01:40:24.035-07:00First they ignore you, then they try to ridicule you, then they fight you, then you win"First they ignore you, then they try to ridicule you, then they fight you, then you win" - is thought to have been said by Gandhi.<br />
<br />
<br />Asankha Pererahttp://www.blogger.com/profile/17313699161300739449noreply@blogger.com0tag:blogger.com,1999:blog-4314823943675891475.post-82643494787313430872012-08-21T04:05:00.002-07:002012-08-21T04:05:26.869-07:00AdroitLogic Announces API Management Solution Based On Its High Performance ESBWe've just <a href="http://www.prweb.com/releases/prweb9820781.htm" target="_blank">announced</a> the APIDirector! an API and Services management solution based on our high performance Enterprise Service Bus UltraESB.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMcoorIAi8rl4yfmZ1V4-o8LfeVXb5Eiuts6OsmbmFI3EPEeHkVlkqmF9wYjAJiTqf1gtqh_94mRhbCgw1mV7-80ZnSpUqwjyTjyhJRgKUm51x-u7g-EKFmN5BJAf9CLMYbnaKUyZ3o-o/s1600/api-director.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMcoorIAi8rl4yfmZ1V4-o8LfeVXb5Eiuts6OsmbmFI3EPEeHkVlkqmF9wYjAJiTqf1gtqh_94mRhbCgw1mV7-80ZnSpUqwjyTjyhJRgKUm51x-u7g-EKFmN5BJAf9CLMYbnaKUyZ3o-o/s1600/api-director.png" /></a></div>
<br />
One of the key differences of the APIDirector is that it will offer both API and Services management features for enterprises, including support for AS2 and other legacy/traditional B2B and service protocols.<br />
<br />
We've announced <a href="http://www.prweb.com/releases/esbperformance/round-6/prweb9778514.htm" target="_blank">results of the 6th Round of ESB Performance Benchmarking</a> earlier in August, although I've missed blogging about it previously, as my father was ill during those few days. The benchmark results showed the extreme performance as well as the stability of the UltraESB, which are both key elements of any API management solution.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicMjKWF24RANTwLP71nlZ28q1MHitp05V98H9cZVF7HM-zZDgFK6AKHXweiQzZs9R3X81YamC0vQJWsG3HthtBSm_28vh4CaoI8ibybIoAw1pXHo-Uv4HiHq2bZs21J7-p3XnX3Lnszn0/s1600/ESB+Performance+Testing+-+Final.png.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="417" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicMjKWF24RANTwLP71nlZ28q1MHitp05V98H9cZVF7HM-zZDgFK6AKHXweiQzZs9R3X81YamC0vQJWsG3HthtBSm_28vh4CaoI8ibybIoAw1pXHo-Uv4HiHq2bZs21J7-p3XnX3Lnszn0/s640/ESB+Performance+Testing+-+Final.png.jpeg" width="640" /></a></div>
Since an API management solution will be the entry point for your trading partners, customers and users accessing your exposed APIs - it MUST be capable of withstanding extreme load, as well as deliberate security attacks, without crashing by itself. The Round 6 results and the related information shows how some of the ESBs fail to withstand even legitimate and relatively small amounts of loads, when compared to an external attack. <br />
<br />
The APIDirector performs functions such as credential management, service logging, auditing and performance
management support, with an easy to use graphical administration interface that also provides analytical features. We also ship the AS2Gateway as an optional module of the APIDirector, and this allows users to deploy a custom AS2 trading gateway - similar to the <a href="http://as2gateway.org/" target="_blank">AS2Gateway</a> we have hosted publicly. <br />
<br />
Next week we will be deploying the AS2Director at one of our beta customer sites in the US, and it will initially deal with defining S/FTP file exchanges and SOAP based services, as well as AS2 based B2B exchanges. The APIDirector will be generally available to the public during the first quarter of 2013, although we will be happy to work with customers with beta releases prior to the general availability. Please <a href="http://www.adroitlogic.org/contact.html" target="_blank">contact us</a> to learn more about the APIDirector, and how you could participate in the beta!<br />
<br />
Original News Release: <a href="http://www.prweb.com/releases/prweb9820781.htm">http://www.prweb.com/releases/prweb9820781.htm</a>Asankhahttp://www.blogger.com/profile/05768379677233692797noreply@blogger.com0tag:blogger.com,1999:blog-4314823943675891475.post-38832291916185252322012-07-31T04:29:00.000-07:002012-07-31T04:29:02.935-07:00Electronic Invoicing Announced on the AS2Gateway<div style="text-align: justify;">
We've just announced support for electronic invoicing on the cloud based Free B2B Trading Gateway <a href="http://as2gateway.org/" target="_blank">AS2Gateway</a>! This allows users to invoice trading partners via EDIFACT INVOIC messages over AS2, using a simple and intuitive web interface</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsUdwXYj2fSDafNcmrf-q6thmSj5jZ2EoTHdUcaCFwXVhJcZS2lwMGhru9zy_zqkKW872R62AbqSyIc7T5hjVUm2yDayxkrcNcNGk9bXp-LYu_deKRLrSeZwYuT7d17mMzqHZbPXW6cBA/s1600/AS2Gateway-Invoice-EDI-AS2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsUdwXYj2fSDafNcmrf-q6thmSj5jZ2EoTHdUcaCFwXVhJcZS2lwMGhru9zy_zqkKW872R62AbqSyIc7T5hjVUm2yDayxkrcNcNGk9bXp-LYu_deKRLrSeZwYuT7d17mMzqHZbPXW6cBA/s640/AS2Gateway-Invoice-EDI-AS2.png" width="563" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Recurrent invoicing is simplified as any invoice can be saved as a template and re-used multiple times. The AS2Gateway converts all the invoice details into an EDIFACT D93A INVOIC message right now, and soon will support the other versions, as well as X12 based messages such as the 810.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
In the near future, the platform will add support for parsing and generation of more message types, which will allow users to easily generate an invoice based on a purchase order received; or an advanced shipping notification (ASN) etc.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
The AS2Gateway offers a free tier to support most SMEs that are required to electronically invoice trading partners for payment. For larger users, a premium tier is available with advanced options (to be announced shortly!), and for retailers or large corporations, the AS2Gateway is available for on-premise private deployment.</div>Asankhahttp://www.blogger.com/profile/05768379677233692797noreply@blogger.com0tag:blogger.com,1999:blog-4314823943675891475.post-68869549874190329272012-07-17T03:30:00.002-07:002012-07-17T03:30:49.427-07:00UltraESB Automates AS2/EDI Based B2B Trading for SKB EuropeWe've just published a new case study on how SKB Europe, a leader in high-quality
aluminium and plastic cases and boxes, has deployed the UltraESB as an
AS2/EDI integration platform for Business-to-Business (B2B) integration.<br />
<br />
The system initially integrates the ERP system of SKB Europe with one
of its key trading partners Amazon, via EDIFACT based EDI documents
exchanged over the AS2 protocol.<br />
<br />
Read the news release and Case study from here<br />
<a href="http://www.prweb.com/releases/2012/7/prweb9706746.htm">http://www.prweb.com/releases/2012/7/prweb9706746.htm</a>Asankhahttp://www.blogger.com/profile/05768379677233692797noreply@blogger.com0tag:blogger.com,1999:blog-4314823943675891475.post-64864379585351485462012-06-28T09:35:00.000-07:002012-06-28T09:35:05.809-07:00ESB Performance Benchmarking Round 6 is coming..AdroitLogic has <a href="http://www.prweb.com/releases/2012/6/prweb9651239.htm">just announced</a> the Sixth round of ESB Performance Benchmarking today!<br />
<br />
Round
5 introduced a public Amazon EC2 AMI image of all the ESB's that were
included into the benchmark, and the next round has moved further by
requesting vendors and/or contributors for submission of better
optimized configurations for the different ESBs to be tested.<br />
<br />
Stability
and Performance are both important to any ESB, and the last round saw
half of the selected ESBs not being able to complete the benchmark
successfully. Each ESB has since releases new versions, and we look
forward to testing each one successfully!<br />
<br />
For more information, visit <a href="http://esbperformance.org/">http://esbperformance.org</a> and email info@adroitlogic.com if you are interested to participate closely with us during this round!Asankhahttp://www.blogger.com/profile/05768379677233692797noreply@blogger.com0tag:blogger.com,1999:blog-4314823943675891475.post-58040432366137429002012-06-25T05:41:00.002-07:002012-06-25T05:41:34.031-07:00UltraESB Connects Coupon Publishers and Major Retailers in Europe in B2B Solution for HighCo Data SpainToday we are happy to announce that Storelabs, a European startup specialized
in FMCG/Retail marketing and operations, has deployed an AS2/EDI -
FTP/XML Gateway for HighCo Data Spain. The Cloud hosted gateway
'PromoHub' initially integrates the retailer Carrefour Spain, with
multiple coupon publishers utilizing the HighCo Data coupon clearing
services.<br />
<br />
Read the full <a href="http://www.prweb.com/releases/ultraesb-highco/b2b-as2-edi-gateway/prweb9636497.htm">Press Release</a> and the <a href="http://downloads.adroitlogic.com/casestudies/UltraESB-StoreLabs-CaseStudy.pdf">Case Study </a>Asankhahttp://www.blogger.com/profile/05768379677233692797noreply@blogger.com0tag:blogger.com,1999:blog-4314823943675891475.post-85783988163032772802012-06-20T05:50:00.000-07:002012-06-20T05:50:41.485-07:00We've just launched our Free EDI/AS2 B2B Gateway - AS2Gateway.ORGSince its launch in January 2010, the UltraESB has the only free and open source ESB that natively supported the widely used B2B trading protocol AS2 (Applicability Statement 2). AS2 is used extensively in the US, Europe and Asia for B2B integration especially in the Retail and Manufacturing industries, and the UltraESB has been used by many organizations to integrate EDI/AS2 systems with S/FTP, Web Services and XML style systems.<br />
<br />
The UltraESB is now used to integrate with some of the largest retailers in Europe, and the US by multiple organizations and it was natural for us to see the potential in offering a Cloud hosted EDI/AS2 solution as a Service (SaaS).<br />
<br />
The <a href="http://as2gateway.org/">AS2Gateway</a> is powered by our flagship product UltraESB, and offers free EDI/AS2 connectivity for SME's and certainly disrupts the traditional market place in both the features offered and the cost savings. For example, the free tier allows SMEs to trade electronically with upto 5 trading partners and offers 60 messages per month.<br />
<br />
We've also just launched <a href="http://as2integration.org/">AS2Integration.ORG</a> which is a resource site on AS2/EDI integration, as well as the documentation and user guide for the use of the AS2Gateway.<br />
<br />
Utilizing the UltraESB underneath means that the flexibility is virtually limitless, and we will soon expand this service to include Electronic Invoicing, EDI document creation and processing as well!<br />
<br />
The AS2Gateway begins its 'beta' testing phase today, and you can utilize all of its features for free until we move into production in a few more months! No credit cards are necessary for sign up - so get your AS2/EDI trading account from the Free <a href="http://as2gateway.org/">AS2Gateway</a>!<br />
<br />
Read our <a href="http://www.prweb.com/releases/adroitlogic/edi-as2-b2b-gateway/prweb9613671.htm">Press Release</a> about the launch for more details!Asankhahttp://www.blogger.com/profile/05768379677233692797noreply@blogger.com0tag:blogger.com,1999:blog-4314823943675891475.post-46384596747730867982012-05-20T22:54:00.004-07:002012-05-20T22:54:53.346-07:00Webinar: UltraESB - The Future of Enterprise IntegrationRegister for our free Webinar on using the UltraESB, on Tuesday the 29th of May 2012.<br />
<br />
<a href="http://www.adroitlogic.org/webinars/ultraesb-future-of-enterprise-integration-29-05-2012.html">Click Here for more details and to Register</a>!Asankhahttp://www.blogger.com/profile/05768379677233692797noreply@blogger.com0