Re: [Architecture] Session Affinity Alternatives

2016-03-21 Thread Frank Leymann
Hi Srinath,

I am not at all arguing in favor of session replication or session
persistence either.

I think in many situation it's fine that a client fails when a session
dropped and the client has to reconnect explicitly - this is option A.

Otherwise (as a second option B), "state transfer" is to be used.  And this
can be achieved by (i) including the full session state in the message
(REST-style), or (ii) including only the session id in the message and hold
the full state in a DB (which is used for session restore if server
affinity has been lost).

Option B.(ii) has quite a bunch of disadvantages: a DB is involved with
obvious performance impact; garbage collection of sessions no longer
needed; DBMS as single point-of-failure;



Best regards,
Frank

2016-03-18 7:08 GMT+01:00 Srinath Perera :

> Hi Frank,
>
> Proposal is when the session parameter has changed, framework (e.g.
> Servelt runtime, or MSS framework) will write the update to the disk
> asynchronsly.
>
> Since we are a middleware platform, impact of losing a session depends on
> the kind of the application end user is running.
>
> However, AFAIK session replication or pressitance that is in WSO2 AS was
> rarely used. ( Azeez, please correct me if I am wrong).
>
> --Srinath
>
> On Thu, Mar 17, 2016 at 11:42 PM, Frank Leymann  wrote:
>
>> Sorry for jumping in late in the discussion
>>
>> Session affinity in general is bad (scalability, HA) - I guess that's
>> what we all agree on.  But in certain scenarios, sticky sessions may be
>> fine.  Thus, what is the underlying scenario in the case we discuss?
>>
>> As far as I understand, persisting session state requires the application
>> to be aware of this. Or is the proposal that provide an environment that
>> reconstructs the session state on behalf of the application?  As Srinath
>> points out we are loosing data if a session aborts and the application is
>> not a transaction: is that critical in our scenario?
>>
>>
>> Best regards,
>> Frank
>>
>> 2016-03-17 10:21 GMT+01:00 Srinath Perera :
>>
>>> Let's not do session replication. It is very hard to make it work IMO.
>>>
>>> I would like to propose a variation to Azeez's version.
>>>
>>> We can do local session + session affinity + asynchronously save the
>>> session state to a DB
>>>
>>> If a node cannot find the session, it will go and reload session from
>>> the DB. ( This should happen if the node has failed, or we have moved
>>> session away due to high load).
>>>
>>> With this model, there is a chance that you might loose last update to
>>> the session. However, that will be very rare. I would keep "asynchronously
>>> save the session state to a DB" off by default, so user will enable it for
>>> complex scenarios.
>>>
>>> --Srinath
>>>
>>>
>>>
>>> On Sat, Mar 12, 2016 at 6:25 PM, Afkham Azeez  wrote:
>>>
 Of course the simplest solution is similar to what Tomcat does, local
 sessions (no replication) & in a cluster, have session affinity configured
 at the load balancer, so that should be the default. If the node that had
 the session dies, the clients connected to that instance would get errors
 or have to login again. For HA deployments, we would need session
 replication or session persistence.

 On Sat, Mar 12, 2016 at 12:58 PM, Sanjiva Weerawarana  wrote:

> Azeez we cannot have a model where every simple server (cluster)
> deployment requires Redis.
>
> Please indicate what you think the right solution is .. its not clear
> to me.
>
> On Thu, Mar 10, 2016 at 7:34 PM, Afkham Azeez  wrote:
>
>> Storing everything as cookies may not work always  and there could be
>> sensitive runtime data that you don't want to save on the browser. In
>> addition, when it comes to Java programming models, using the HTTP 
>> session
>> to store serializable objects is the natural way of programming. Yes, 
>> your
>> solution would work for certain cases, but it doesn't cover all cases.
>>
>> On Thu, Mar 10, 2016 at 6:48 PM, Joseph Fonseka 
>> wrote:
>>
>>> I think we should go with 3 to keep things simple.
>>>
>>> To solve HA problem ( without session persistence or replication ).
>>>
>>> 1. Use SSO to authenticate the user.
>>> 2. Use the session to store the claims return from IdP. ( Ex
>>> user_id, roles )
>>> 3. DO NOT store app specific data on the session instead use
>>> cookies, local storage in the browser.
>>> 4. In case the container get terminated and user get redirected to
>>> another container it will initiate a SSO flow and repopulate a new 
>>> session
>>> with user claims. Then the app can continue as normal.
>>>
>>> WDYT?
>>>
>>> Regards
>>> Jo
>>>
>>>
>>>
>>>
>>>
>>>
>>> On Thu, Mar 10, 2016 at 

[Architecture] WSO2 Carbon Caching - 1.0.0-M1 Released

2016-03-21 Thread Aruna Karunarathna
Hi all,

Please note $subject.

You may install carbon-caching feature to your product with:

org.wso2.carbon.caching
org.wso2.carbon.caching.feature
1.0.0-m1

Please refer [1] for instructions on using carbon-caching.

[1]. https://github.com/wso2/carbon-caching/tree/v1.0.0-m1

Regards,
Aruna
-- 

*Aruna Sujith Karunarathna *
WSO2, Inc | lean. enterprise. middleware.
#20, Palm Grove, Colombo 03, Sri Lanka
Mobile: +94 71 9040362 | Work: +94 112145345
Email: ar...@wso2.com | Web: www.wso2.com
___
Architecture mailing list
Architecture@wso2.org
https://mail.wso2.org/cgi-bin/mailman/listinfo/architecture


Re: [Architecture] should ESB 5 drop the default transports??

2016-03-21 Thread Harshana Eranga Martin
Hi Sanjiva,

We will lose the backward compatibility if we do that. Hence Will be a
major issue for the existing customers.

Thanks and Regards,
Harshana

On Monday, 21 March 2016, Sanjiva Weerawarana  wrote:

> With the advent of inbound transports, the "old" Axis2 transports are no
> longer needed.
>
> Should we consider shipping the next version with no default / built-in
> transports??
>
> Sanjiva.
> --
> Sanjiva Weerawarana, Ph.D.
> Founder, CEO & Chief Architect; WSO2, Inc.;  http://wso2.com/
> email: sanj...@wso2.com ;
> office: (+1 650 745 4499 | +94  11 214 5345) x5700; cell: +94 77 787 6880
> | +1 408 466 5099; voip: +1 650 265 8311
> blog: http://sanjiva.weerawarana.org/; twitter: @sanjiva
> Lean . Enterprise . Middleware
>


-- 
Sent from Gmail Mobile for IPhone
___
Architecture mailing list
Architecture@wso2.org
https://mail.wso2.org/cgi-bin/mailman/listinfo/architecture


[Architecture] WSO2 Carbon Datasources - 1.0.0-M1 Released

2016-03-21 Thread KasunG Gajasinghe
Hi,

Please note $subject.

The carbon-datasources feature can be installed with the following
dependency -


  org.wso2.carbon.datasources
  org.wso2.carbon.datasource.core.feature
  1.0.0-m1
  zip


Thanks,
KasunG

-- 

*Kasun Gajasinghe*Senior Software Engineer, WSO2 Inc.
email: kasung AT spamfree wso2.com
linked-in: http://lk.linkedin.com/in/gajasinghe
blog: http://kasunbg.org
___
Architecture mailing list
Architecture@wso2.org
https://mail.wso2.org/cgi-bin/mailman/listinfo/architecture


Re: [Architecture] [Analytics][APIM] - Implement Geo location graph in Analytics

2016-03-21 Thread Nirmal Fernando
Great work Tharindu!

@Seshi I think we should use this implementation.

On Mon, Mar 21, 2016 at 12:11 PM, Seshika Fernando  wrote:

> Hi Pulasthi,
>
> Can we use this for our IP->Region conversion?
>
> seshi
>
> On Mon, Mar 21, 2016 at 11:06 AM, Tharindu Dharmarathna <
> tharin...@wso2.com> wrote:
>
>> Hi Janaka and All,
>>
>> Here is the performance test result which we have done .
>>
>> No of Different IP's : 2000
>>
>> Time Taken to Retrieve and Run the spark script Before Cache : 5.191
>> seconds.
>>
>> Time Taken to Retrieve and Run After cache : 0.025 seconds.
>>
>>
>> Thanks
>> Tharindu
>>
>> On Fri, Mar 18, 2016 at 9:39 AM, Lochana Ranaweera 
>> wrote:
>>
>>> Hi Kishanthan,
>>>
>>> Started work on using the same UDF.
>>>
>>> Thanks,
>>> Lochana
>>>
>>> On Thu, Mar 17, 2016 at 11:04 PM, Kishanthan Thangarajah <
>>> kishant...@wso2.com> wrote:
>>>
 Lochana, let's try to reuse this udf for AS analytics too.

 On Thu, Mar 17, 2016 at 2:43 PM, Janaka Ranabahu 
 wrote:

> Hi Tharindu,
>
> Great work. Can we do a performance test of this and share the
> results. Basically what we need to check is to see how much time a script
> would take to execute.
>
> Thanks,
> Janaka
>
> On Thu, Mar 17, 2016 at 2:37 PM, Tharindu Dharmarathna <
> tharin...@wso2.com> wrote:
>
>> Hi All,
>>
>> After Going though above discussion , We had implemented the
>> Plug-gable User Define Extension point. From this configuration We can
>> write our own implementation which can used to get the Country and State 
>> of
>> the Given IP.
>>
>> *Caching Implementation*
>>
>> We define two level of caching as below.
>>
>> When IP address checked from the *UDF* , First It check on Cache to
>> get the Location Information. If it is not in cache  It I'll check on
>> another database which contain IP to Location Direct Mapping as
>> *Sajith* Mentioned. If it is there it will return and cache that
>> location. If location not in that database , IP will check against the
>> *MAXMIND* database. and store the location on cache and the above
>> table.
>>
>> Thanks
>> Tharindu
>>
>>
>> On Tue, Mar 8, 2016 at 2:34 PM, Tharindu Dharmarathna <
>> tharin...@wso2.com> wrote:
>>
>>> Hi All,
>>>
>>> We have come across following ways to do the above task after the
>>> Initial POC.
>>>
>>> 1. Using File type database which given by max-mind (.mmdb) and use
>>> there database readers.
>>>
>>> From this approach we got lesser value to get the location from the
>>> above using JAX-RS service which is used to wrap the above database. 
>>> This
>>> JAX-RS implementation is by default used the max-mind's Cache
>>> implementation which can find from [1] .
>>>
>>> *Limitations*
>>>
>>>
>>>- Hosting of the Jax-RS app in another server.
>>>- # of http calls will high.
>>>
>>>
>>> 2. Call query server as above thread and cached the location with ip.
>>>
>>> Here you can find the execution time for a single query which get
>>> for each method.
>>>
>>>
>>> *Method 1 : 4.5 seconds*
>>>
>>> *Method 2: 4.76 seconds*
>>>
>>>
>>> Thanks
>>> Tharindu
>>>
>>>
>>> On Tue, Mar 8, 2016 at 8:29 AM, Lasantha Fernando >> > wrote:
>>>
 Hi Tharindu,

 On 7 March 2016 at 21:10, Sajith Ravindra  wrote:

>
> 2. Having a DB based cache would persist the data even on a
>> restart and the data fetching query would be searching for an 
>> specific
>> value(not a range query as against the max-mind DB). But the 
>> downside is
>> that for a cache miss there would be minimum 3 DB queries (one for 
>> the
>> cache table lookup and one for the max-mind db lookup and one for the
>> cache persistence).
>>
>
> In order to avoid expensive cache misses we may eagerly populate
> the DB table cache. i.e. When there's a cache miss we do the lookup in
> max-mind db and then add multiple entries for multiple IPs of that
> netwokrk_cid to the Cache DB table instead of only for that 
> particular IP.
> That way we reduce the chance of cache miss being very expensive, as 
> we
> increase the chance of it being found on the first DB lookup.
>
> We might need to do some evaluation to determine how much entries
> that we are going to add to the DB cache for IP belongs to a  
> particular
> netwokrk_cid. For an example if requests from a certain netwokrk_cidr 
> is
> frequent we may want to add more entries with compared to a less 

Re: [Architecture] [Analytics][APIM] - Implement Geo location graph in Analytics

2016-03-21 Thread Seshika Fernando
Hi Pulasthi,

Can we use this for our IP->Region conversion?

seshi

On Mon, Mar 21, 2016 at 11:06 AM, Tharindu Dharmarathna 
wrote:

> Hi Janaka and All,
>
> Here is the performance test result which we have done .
>
> No of Different IP's : 2000
>
> Time Taken to Retrieve and Run the spark script Before Cache : 5.191
> seconds.
>
> Time Taken to Retrieve and Run After cache : 0.025 seconds.
>
>
> Thanks
> Tharindu
>
> On Fri, Mar 18, 2016 at 9:39 AM, Lochana Ranaweera 
> wrote:
>
>> Hi Kishanthan,
>>
>> Started work on using the same UDF.
>>
>> Thanks,
>> Lochana
>>
>> On Thu, Mar 17, 2016 at 11:04 PM, Kishanthan Thangarajah <
>> kishant...@wso2.com> wrote:
>>
>>> Lochana, let's try to reuse this udf for AS analytics too.
>>>
>>> On Thu, Mar 17, 2016 at 2:43 PM, Janaka Ranabahu 
>>> wrote:
>>>
 Hi Tharindu,

 Great work. Can we do a performance test of this and share the results.
 Basically what we need to check is to see how much time a script would take
 to execute.

 Thanks,
 Janaka

 On Thu, Mar 17, 2016 at 2:37 PM, Tharindu Dharmarathna <
 tharin...@wso2.com> wrote:

> Hi All,
>
> After Going though above discussion , We had implemented the
> Plug-gable User Define Extension point. From this configuration We can
> write our own implementation which can used to get the Country and State 
> of
> the Given IP.
>
> *Caching Implementation*
>
> We define two level of caching as below.
>
> When IP address checked from the *UDF* , First It check on Cache to
> get the Location Information. If it is not in cache  It I'll check on
> another database which contain IP to Location Direct Mapping as
> *Sajith* Mentioned. If it is there it will return and cache that
> location. If location not in that database , IP will check against the
> *MAXMIND* database. and store the location on cache and the above
> table.
>
> Thanks
> Tharindu
>
>
> On Tue, Mar 8, 2016 at 2:34 PM, Tharindu Dharmarathna <
> tharin...@wso2.com> wrote:
>
>> Hi All,
>>
>> We have come across following ways to do the above task after the
>> Initial POC.
>>
>> 1. Using File type database which given by max-mind (.mmdb) and use
>> there database readers.
>>
>> From this approach we got lesser value to get the location from the
>> above using JAX-RS service which is used to wrap the above database. This
>> JAX-RS implementation is by default used the max-mind's Cache
>> implementation which can find from [1] .
>>
>> *Limitations*
>>
>>
>>- Hosting of the Jax-RS app in another server.
>>- # of http calls will high.
>>
>>
>> 2. Call query server as above thread and cached the location with ip.
>>
>> Here you can find the execution time for a single query which get for
>> each method.
>>
>>
>> *Method 1 : 4.5 seconds*
>>
>> *Method 2: 4.76 seconds*
>>
>>
>> Thanks
>> Tharindu
>>
>>
>> On Tue, Mar 8, 2016 at 8:29 AM, Lasantha Fernando 
>> wrote:
>>
>>> Hi Tharindu,
>>>
>>> On 7 March 2016 at 21:10, Sajith Ravindra  wrote:
>>>

 2. Having a DB based cache would persist the data even on a restart
> and the data fetching query would be searching for an specific 
> value(not a
> range query as against the max-mind DB). But the downside is that for 
> a
> cache miss there would be minimum 3 DB queries (one for the cache 
> table
> lookup and one for the max-mind db lookup and one for the
> cache persistence).
>

 In order to avoid expensive cache misses we may eagerly populate
 the DB table cache. i.e. When there's a cache miss we do the lookup in
 max-mind db and then add multiple entries for multiple IPs of that
 netwokrk_cid to the Cache DB table instead of only for that particular 
 IP.
 That way we reduce the chance of cache miss being very expensive, as we
 increase the chance of it being found on the first DB lookup.

 We might need to do some evaluation to determine how much entries
 that we are going to add to the DB cache for IP belongs to a  
 particular
 netwokrk_cid. For an example if requests from a certain netwokrk_cidr 
 is
 frequent we may want to add more entries with compared to a less 
 frequent
 netwokrk_cidr.

 The downside is the DB cache tend to be more big.

 Thanks
 *,Sajith Ravindra*
 Senior Software Engineer
 WSO2 Inc.; http://wso2.com
 lean.enterprise.middleware

 mobile: +94 77 2273550
 blog: 

Re: [Architecture] [Analytics] Improvements to Lucene based Aggregate functions (Installing Aggregates as OSGI components)

2016-03-21 Thread Gimantha Bandara
Hi Chathura,

In previous reply, I misunderstood your suggestion. Yes. We can move
aggregateFields to object level. So the user can pass the aggregateFields
by another interface method or by the object constructor. Thank you for
your suggestion!

@Anjana, WDYT? Shall we add another method to pass the fields instead
passing fields every time a record is processed. User will have to assign
the fields to an object level variable of the object level and use that
variable inside the process method.

On Mon, Mar 21, 2016 at 11:39 AM, Chathura Ekanayake 
wrote:

> Hi Gimantha,
>
> Yes, hard-coding aggregateFields imposes a limitation. But, if I
> understood correct.. once we do a REST API call, we have to execute
> process(...) method for each record in the store. But for a single REST API
> call aggregateFields is a constant. So we can set those fields (at the
> object level) after receiving a REST API call (before executing the
> process() method for the first record).
>
> Regards,
> Chathura
>
>
> On Mon, Mar 21, 2016 at 11:12 AM, Gimantha Bandara 
> wrote:
>
>> Hi Chathura,
>>
>> AggregateFields are the fields which are needed to calculate the
>> aggregate values. For example, If you want to calculate SUM of
>> "subject_mark" of records representing students, then subject_marks will be
>> the only element in aggregateFields, since calculating SUM only involves
>> one field. AggregateFields are constant for a specific AggregateFunction.
>> But the name of the field can be changed. AggregateFields are defined using
>> REST APIs or JS APIs as shown below.
>>
>> *Calling custom aggregate functions through Javascript API*
>>
>> var queryInfo = {
>> tableName:"Students", //table name on which the aggregation is
>> performed
>> searchParams : {
>> groupByField:"location", //grouping field if any
>> query : "Grade:10" //additional filtering query
>> aggregateFields:[
>> {
>>* fields:["Height", "Weight"],* //fields necessary for
>> aggregate function
>> aggregate:"CUSTOM_AGGREGATE", //unique name of the aggregate
>> function, this is what we return using "getAggregateName" method above.
>> alias:"aggregated_result" //Alias for the result of the
>> aggregate function
>> }]
>> }
>> }
>>
>> client.searchWithAggregates(queryInfo, function(data) {
>>   console.log (data["message"]);
>> }, function(error) {
>>   console.log("error occured: " + error["message"]);
>> });
>>
>>
>>
>> *Aggregates REST APIs*This is as same as the Javascript API.
>>
>> POST https://localhost:9443/analytics/aggregates
>> {
>>  "tableName":"Students",
>>  "groupByField":"location",
>>  "aggregateFields":[
>>{
>>  *"fields":["Height", "Weight"],*
>>  "aggregate":"CUSTOM_AGGREGATE",
>>  "alias":"aggregated_result"
>>}]
>> }
>>
>> Once you define, the aggregateFields using REST APIs or JS APIs, those
>> fields will be available as aggregateFields array in the process method.
>>
>> On Mon, Mar 21, 2016 at 10:18 AM, Chathura Ekanayake 
>> wrote:
>>
>>>
>>>
>>>
>>> This method will get called for all the records which need to be
 aggregated. RecordValuesContext will contain the record values of the
 current record being processed. aggregateFields will contain an array of
 fields which will be used for the aggregation. The order of the
 aggregateFields will matter when we implement the logic. For example, lets
 say we are going to implement SUM aggregate. Then we know that only one
 field will be required to calculate SUM and always aggregateFields will
 contain one field name in it, which is the name of the field being SUMed.

 public void process(RecordValuesContext ctx, String[] aggregateFields)
 throws AnalyticsException {
 if (aggregateFields == null || aggregateFields.length == 0) {
 throw new AnalyticsException("Field to be aggregated, is
 missing");
 }
 Object value = ctx.getValue(aggregateFields[0]);
 if (value == null) {
 throw new AnalyticsException("Error while calculating SUM:
 value of the field, " +
  aggregateFields[0] + " is
 null");
 }
 if (value instanceof Number) {
 sum += ((Number)value).doubleValue();
 } else {
 throw new AnalyticsException("Error while calculating
 Average: Value '" + value.toString() +
  "', being aggregated is not
 numeric.");
 }
 }



>>> Hi Gimantha
>>>
>>> Is aggregateFields parameter a constant for an AggregateFunction object?
>>> In that case, can we set it just after instantiating an object?
>>>
>>
>> I assume that you are asking if we can define the aggregateFields inside
>> AggregateFunction object 

Re: [Architecture] [PET] Improvement on Redmine connector

2016-03-21 Thread Kalyani Yogeswaranathan
Hi All,

I am going to implement some of the alpha methods for Redmine connector.

Custom Fields : Get method [1]
Groups : CRUD (Create, Read,Update, Delete) [2]

[1] http://www.redmine.org/projects/redmine/wiki/Rest_CustomFields

[2] http://www.redmine.org/projects/redmine/wiki/Rest_Groups


Please let me know if you have any suggestion on this.

Thanks


On Fri, Mar 18, 2016 at 8:17 PM, Kalyani Yogeswaranathan 
wrote:

> Hi Malaka,
>
> I have checked the redmine connector methods[1] with API documentation[2]
> for whether all parameters support or not. I have found that, all
> implemented methods support for all of the available parameters.
>
> As we discussed in the meeting we no need to implement alpha methods.
>
> WDYT?
>
> [1] https://github.com/wso2-extensions/esb-connector-redmine
>
> [2] http://www.redmine.org/projects/redmine/wiki/Rest_api
>
> On Thu, Mar 17, 2016 at 2:42 PM, Kalyani Yogeswaranathan  > wrote:
>
>> Yes Malaka, I'll check and update.
>>
>> On Thu, Mar 17, 2016 at 10:24 AM, Malaka Silva  wrote:
>>
>>> Hi Kalyani,
>>>
>>> Can we check if we can further improve the existing improved methods?
>>>
>>> eg:- Support all optional parameters, etc.
>>>
>>> On Wed, Mar 16, 2016 at 6:36 PM, Kalyani Yogeswaranathan <
>>> kaly...@wso2.com> wrote:
>>>
 Hi All,

 I am going to improve Redmine connector[1]. For that I have analysed
 the  Redmine REST API. There are 3 type of status (stable,beta, alpha)
 methods are available in the API [2].

- stable ( feature complete, no major changes planned )
- beta (usable for integrations with some bugs or missing minor
functionality)
- alpha (major functionality in place, needs feedback from API
users and integrators )

 All stable and beta type of  methods were already implemented. And one
 of the alpha type of method also implemented.

 For the improvement I am planning to do rest of the alpha methods.

 Now I am doing further research to find the methods in priority. When I
 finished the further research I'll update this mail thread soon.

 Please let me know if you have any improvements/suggestion on Redmine
 connector to implement.

 [1] https://docs.wso2.com/display/ESBCONNECTORS/Redmine+Connector
 [2] http://www.redmine.org/projects/redmine/wiki/Rest_api

 --

 *Kalyani Yogeswaranathan*

 *Associate software engineer*
 *WSO2 Inc.*

 *Mobile: 0776390284 <0776390284>*

>>>
>>>
>>>
>>> --
>>>
>>> Best Regards,
>>>
>>> Malaka Silva
>>> Senior Tech Lead
>>> M: +94 777 219 791
>>> Tel : 94 11 214 5345
>>> Fax :94 11 2145300
>>> Skype : malaka.sampath.silva
>>> LinkedIn : http://www.linkedin.com/pub/malaka-silva/6/33/77
>>> Blog : http://mrmalakasilva.blogspot.com/
>>>
>>> WSO2, Inc.
>>> lean . enterprise . middleware
>>> http://www.wso2.com/
>>> http://www.wso2.com/about/team/malaka-silva/
>>> 
>>> https://store.wso2.com/store/
>>>
>>> Save a tree -Conserve nature & Save the world for your future. Print
>>> this email only if it is absolutely necessary.
>>>
>>
>>
>>
>> --
>>
>> *Kalyani Yogeswaranathan*
>>
>> *Associate software engineer*
>> *WSO2 Inc.*
>>
>> *Mobile: 0776390284*
>>
>
>
>
> --
>
> *Kalyani Yogeswaranathan*
>
> *Associate software engineer*
> *WSO2 Inc.*
>
> *Mobile: 0776390284*
>



-- 

*Kalyani Yogeswaranathan*

*Associate software engineer*
*WSO2 Inc.*

*Mobile: 0776390284*
___
Architecture mailing list
Architecture@wso2.org
https://mail.wso2.org/cgi-bin/mailman/listinfo/architecture