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 <locha...@wso2.com> > 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 <jan...@wso2.com> >>> 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 <lasan...@wso2.com> >>>>>> wrote: >>>>>> >>>>>>> Hi Tharindu, >>>>>>> >>>>>>> On 7 March 2016 at 21:10, Sajith Ravindra <saji...@wso2.com> 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: http://sajithr.blogspot.com/ >>>>>>>> <http://lk.linkedin.com/pub/shani-ranasinghe/34/111/ab> >>>>>>>> >>>>>>>> On Mon, Mar 7, 2016 at 4:37 AM, Tharindu Dharmarathna < >>>>>>>> tharin...@wso2.com> wrote: >>>>>>>> >>>>>>>>> Hi Lasantha, >>>>>>>>> >>>>>>>>> Upto now we are doing the following way in order to get the geo >>>>>>>>> location from the stated dump. >>>>>>>>> >>>>>>>>> 1. two columns added filled with long value of lower and upper >>>>>>>>> value of network ip addresses. Then get the geoname_id with respect >>>>>>>>> to the >>>>>>>>> long value for the given ip which between this above long values. >>>>>>>>> Hope you >>>>>>>>> will got this idea on our approach. Is there any way to do bit wise >>>>>>>>> operation in order to get the network_cidr value ? . >>>>>>>>> >>>>>>>> >>>>>>> Can't we do it by keeping the network IP and the subnet as two >>>>>>> columns and the geoname_id as the third. Say for example, if >>>>>>> 192.168.0.0/20 is the cidr, for IPv4 routing what is usually done >>>>>>> is we get the IP as int, then do a bitwise AND with the subnet mask >>>>>>> (e.g. >>>>>>> if subnet mask is 20, that would mean 20 bits with value 1 and >>>>>>> remaining 12 >>>>>>> bits of value 0, i.e. 11111111 11111111 11110000 00000) and check >>>>>>> whether >>>>>>> that returns the network IP. >>>>>>> >>>>>>> You might find more info here [1]. I think there should be libraries >>>>>>> that wrap this operation. But if performance is a concern and we need to >>>>>>> keep the cache search implementation very lean, we can implement it >>>>>>> ourselves. >>>>>>> >>>>>>> WDYT? >>>>>>> >>>>>>> [1] >>>>>>> http://stackoverflow.com/questions/4209760/validate-an-ip-address-with-mask >>>>>>> >>>>>>> Thanks, >>>>>>> Lasantha >>>>>>> >>>>>>> >>>>>>>>> Thanks >>>>>>>>> Tharindu >>>>>>>>> >>>>>>>>> On Mon, Mar 7, 2016 at 12:05 AM, Lasantha Fernando < >>>>>>>>> lasan...@wso2.com> wrote: >>>>>>>>> >>>>>>>>>> Hi all, >>>>>>>>>> >>>>>>>>>> I think what Sachith suggests also makes sense. But am also >>>>>>>>>> rooting for the in-memory cache implementation suggested by Sanjeewa >>>>>>>>>> with >>>>>>>>>> ip-netmask approach. >>>>>>>>>> >>>>>>>>>> Please find my comments inline. >>>>>>>>>> >>>>>>>>>> On 5 March 2016 at 23:50, Sachith Withana <sach...@wso2.com> >>>>>>>>>> wrote: >>>>>>>>>> >>>>>>>>>>> Hi all, >>>>>>>>>>> >>>>>>>>>>> From what I understand/was told, this happens once a day ( or >>>>>>>>>>> relatively infrequently), and you wanna avoid searching through all >>>>>>>>>>> the geo >>>>>>>>>>> data per ip ( since you are grouping the requests by IP). >>>>>>>>>>> >>>>>>>>>>> IF that's the case, it would be better to use a separate DB >>>>>>>>>>> table to cache these data ( IP, geoID ..etc) with the IP being the >>>>>>>>>>> primary >>>>>>>>>>> key ( which would improve the lookup time), and even though there >>>>>>>>>>> will be >>>>>>>>>>> cache misses, it would eventually reduce the (#cacheMisses/ Hits). >>>>>>>>>>> >>>>>>>>>>> Having a DB cache would be better since you do want to persist >>>>>>>>>>> these data to be used over time. >>>>>>>>>>> >>>>>>>>>>> BTW in a cache miss, if we can figure out a way to limit the >>>>>>>>>>> search range on the original table or at least stop the search once >>>>>>>>>>> a match >>>>>>>>>>> is found, it would greatly improve the cache miss time as well. >>>>>>>>>>> >>>>>>>>>>> That's my two cents. >>>>>>>>>>> >>>>>>>>>>> Cheers, >>>>>>>>>>> Sachith >>>>>>>>>>> >>>>>>>>>>> On Sun, Mar 6, 2016 at 8:24 AM, Janaka Ranabahu <jan...@wso2.com >>>>>>>>>>> > wrote: >>>>>>>>>>> >>>>>>>>>>>> Hi Sanjeewa, >>>>>>>>>>>> >>>>>>>>>>>> On Sun, Mar 6, 2016 at 7:25 AM, Sanjeewa Malalgoda < >>>>>>>>>>>> sanje...@wso2.com> wrote: >>>>>>>>>>>> >>>>>>>>>>>>> Implementing cache is better than having another table mapping >>>>>>>>>>>>> IMO. What if we query database and keep IP range and network name >>>>>>>>>>>>> in memory. >>>>>>>>>>>>> Then we may do quick search on network name and then based on >>>>>>>>>>>>> that rest can load some other way. >>>>>>>>>>>>> WDYT? >>>>>>>>>>>>> >>>>>>>>>>>> We thought of having an in memory cache but we faced several >>>>>>>>>>>> issues along the way. Let me explain the situation as it is per >>>>>>>>>>>> now. >>>>>>>>>>>> >>>>>>>>>>>> The Max-Mind DB has the IP addresses with the IP and the >>>>>>>>>>>> netmask. >>>>>>>>>>>> Ex: 192.168.0.0/20 >>>>>>>>>>>> >>>>>>>>>>>> The calculation of the IP address range would be like the >>>>>>>>>>>> following. >>>>>>>>>>>> >>>>>>>>>>>> Address: 192.168.0.1 11000000.10101000.0000 >>>>>>>>>>>> 0000.00000001 >>>>>>>>>>>> Netmask: 255.255.240.0 = 20 11111111.11111111.1111 >>>>>>>>>>>> 0000.00000000 >>>>>>>>>>>> Wildcard: 0.0.15.255 00000000.00000000.0000 >>>>>>>>>>>> 1111.11111111 >>>>>>>>>>>> =>Network: 192.168.0.0/20 11000000.10101000.0000 >>>>>>>>>>>> 0000.00000000 (Class C) >>>>>>>>>>>> Broadcast: 192.168.15.255 11000000.10101000.0000 >>>>>>>>>>>> 1111.11111111 >>>>>>>>>>>> HostMin: 192.168.0.1 11000000.10101000.0000 >>>>>>>>>>>> 0000.00000001 >>>>>>>>>>>> HostMax: 192.168.15.254 11000000.10101000.0000 >>>>>>>>>>>> 1111.11111110 >>>>>>>>>>>> Hosts/Net: 4094 (Private Internet >>>>>>>>>>>> <http://www.ietf.org/rfc/rfc1918.txt>) >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> Therefore what we are currently doing is to calculate the start >>>>>>>>>>>> and end IP for all the values in the max-mind DB and alter the >>>>>>>>>>>> tables with >>>>>>>>>>>> those values initially(this is a one time thing that will happen). >>>>>>>>>>>> When the >>>>>>>>>>>> Spark script executes, we check whether the given IP is between >>>>>>>>>>>> any of the >>>>>>>>>>>> start and end ranges in the tables. That is the reason why it is >>>>>>>>>>>> taking a >>>>>>>>>>>> long time to fetch results for a given IP. >>>>>>>>>>>> >>>>>>>>>>>> As a solution for this, we discussed what Tharindu has >>>>>>>>>>>> mentioned. >>>>>>>>>>>> 1. Have a in memory caching mechanism. >>>>>>>>>>>> 2. Have a DB based caching mechanism. >>>>>>>>>>>> >>>>>>>>>>>> The only point that we have to highlight is the fact that in >>>>>>>>>>>> both the above mechanisms we need to cache the IP address(not the >>>>>>>>>>>> ip-netmask as it was in the max-mind db) against the Geo location. >>>>>>>>>>>> >>>>>>>>>>>> Ex:- >>>>>>>>>>>> For 192.168.0.1 - Colombo, Sri Lanka >>>>>>>>>>>> For 192.168.15.254 - Colombo, Sri Lanka >>>>>>>>>>>> >>>>>>>>>>>> So as per the above example I took, if there are requests form >>>>>>>>>>>> all the possible 4094 address we will be caching each IP with the >>>>>>>>>>>> Geo >>>>>>>>>>>> location(since introducing range queries in a cache is not a good >>>>>>>>>>>> practice). >>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>> Since we are implementing a custom cache, won't we be doing a >>>>>>>>>> bitwise operation for the lookup with netmask and network IP? So >>>>>>>>>> basically, >>>>>>>>>> we would keep the network IP and the netmask in cache and simply do a >>>>>>>>>> bitwise AND to determine whether it is a match or not, right? Am >>>>>>>>>> thinking >>>>>>>>>> such an operation would not incur much of a performance hit and it >>>>>>>>>> won't be >>>>>>>>>> as prohibitive as a normal range query in a cache. If that is the >>>>>>>>>> case, I >>>>>>>>>> think we can go with the approach suggested by Sanjeewa. >>>>>>>>>> >>>>>>>>>> WDYT? >>>>>>>>>> >>>>>>>>>> >>>>>>>>>>>> Please find my comments about both the approaches. >>>>>>>>>>>> >>>>>>>>>>>> 1. Having an in-memory cache would speedup things but based on >>>>>>>>>>>> the IPs in the data set, there could be number of entries for IPs >>>>>>>>>>>> in the >>>>>>>>>>>> same range. One problem with this approach is that, if there is a >>>>>>>>>>>> server >>>>>>>>>>>> restart, the initial script execution would take a lots of time. >>>>>>>>>>>> Also based >>>>>>>>>>>> on certain scenarios(high number of different IPs) the cache would >>>>>>>>>>>> not have >>>>>>>>>>>> a significant effect on script execution performance. >>>>>>>>>>>> >>>>>>>>>>>> 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). >>>>>>>>>>>> >>>>>>>>>>>> That is why we have initiated this thread to finalize the >>>>>>>>>>>> caching approach we should take. >>>>>>>>>>>> >>>>>>>>>>>> Thanks, >>>>>>>>>>>> Janaka >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>>> Thanks, >>>>>>>>>>>>> sanjeewa. >>>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>> Thanks, >>>>>>>>>> Lasantha >>>>>>>>>> >>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>>>> On Fri, Mar 4, 2016 at 3:12 PM, Tharindu Dharmarathna < >>>>>>>>>>>>> tharin...@wso2.com> wrote: >>>>>>>>>>>>> >>>>>>>>>>>>>> Hi All, >>>>>>>>>>>>>> >>>>>>>>>>>>>> We are going to implement Client IP based Geo-location Graph >>>>>>>>>>>>>> in API Manager Analytics. When we go through the ways of doing >>>>>>>>>>>>>> in [1] , we >>>>>>>>>>>>>> selected [2] as the most suitable way to do. >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> *Overview of max-mind's DB.* >>>>>>>>>>>>>> >>>>>>>>>>>>>> As the structure of the db (attached in image), They have two >>>>>>>>>>>>>> tables which incorporate to get the location. >>>>>>>>>>>>>> >>>>>>>>>>>>>> Find geoname_id according to network and get Country,City >>>>>>>>>>>>>> from locations table. >>>>>>>>>>>>>> >>>>>>>>>>>>>> *Limitations* >>>>>>>>>>>>>> >>>>>>>>>>>>>> As their database dump we couldn't directly process the ip >>>>>>>>>>>>>> from those tables. We need to check the given ip is in between >>>>>>>>>>>>>> the network >>>>>>>>>>>>>> min and max ip. This query get some long time (10 seconds in >>>>>>>>>>>>>> indexed data). >>>>>>>>>>>>>> If we directly do this from spark script for each and every ip >>>>>>>>>>>>>> which in >>>>>>>>>>>>>> summary table (regardless if ip is same from two row data) will >>>>>>>>>>>>>> query from >>>>>>>>>>>>>> the tables. Therefore this will incur the performance impact on >>>>>>>>>>>>>> this graph. >>>>>>>>>>>>>> >>>>>>>>>>>>>> *Solution* >>>>>>>>>>>>>> >>>>>>>>>>>>>> 1. Implement LRU cache against ip address vs location. >>>>>>>>>>>>>> >>>>>>>>>>>>>> This will need to implement on custom UDF in Spark. If ip >>>>>>>>>>>>>> querying from spark available in cache it will give the location >>>>>>>>>>>>>> from it , >>>>>>>>>>>>>> IF it is not It will retrieve from DB and put into the cache. >>>>>>>>>>>>>> >>>>>>>>>>>>>> 2. Persist in a Table >>>>>>>>>>>>>> >>>>>>>>>>>>>> ip as the primary key and Country and city as other columns >>>>>>>>>>>>>> and retrieve data from that table. >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> Please feel free to give us the most suitable way of doing >>>>>>>>>>>>>> this solution?. >>>>>>>>>>>>>> >>>>>>>>>>>>>> [1] - Implementing Geographical based Analytics in API >>>>>>>>>>>>>> Manager mail thread. >>>>>>>>>>>>>> >>>>>>>>>>>>>> [2] - http://dev.maxmind.com/geoip/geoip2/geolite2/ >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> *Thanks* >>>>>>>>>>>>>> >>>>>>>>>>>>>> *Tharindu Dharmarathna* >>>>>>>>>>>>>> Associate Software Engineer >>>>>>>>>>>>>> WSO2 Inc.; http://wso2.com >>>>>>>>>>>>>> lean.enterprise.middleware >>>>>>>>>>>>>> >>>>>>>>>>>>>> mobile: *+94779109091 <%2B94779109091>* >>>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> -- >>>>>>>>>>>>> >>>>>>>>>>>>> *Sanjeewa Malalgoda* >>>>>>>>>>>>> WSO2 Inc. >>>>>>>>>>>>> Mobile : +94713068779 >>>>>>>>>>>>> >>>>>>>>>>>>> <http://sanjeewamalalgoda.blogspot.com/>blog >>>>>>>>>>>>> :http://sanjeewamalalgoda.blogspot.com/ >>>>>>>>>>>>> <http://sanjeewamalalgoda.blogspot.com/> >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> -- >>>>>>>>>>>> *Janaka Ranabahu* >>>>>>>>>>>> Associate Technical Lead, WSO2 Inc. >>>>>>>>>>>> http://wso2.com >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> *E-mail: jan...@wso2.com <http://wso2.com>**M: **+94 718370861 >>>>>>>>>>>> <%2B94%20718370861>* >>>>>>>>>>>> >>>>>>>>>>>> Lean . Enterprise . Middleware >>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> -- >>>>>>>>>>> Sachith Withana >>>>>>>>>>> Software Engineer; WSO2 Inc.; http://wso2.com >>>>>>>>>>> E-mail: sachith AT wso2.com >>>>>>>>>>> M: +94715518127 >>>>>>>>>>> Linked-In: <http://goog_416592669> >>>>>>>>>>> https://lk.linkedin.com/in/sachithwithana >>>>>>>>>>> >>>>>>>>>>> _______________________________________________ >>>>>>>>>>> Architecture mailing list >>>>>>>>>>> Architecture@wso2.org >>>>>>>>>>> https://mail.wso2.org/cgi-bin/mailman/listinfo/architecture >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> *Lasantha Fernando* >>>>>>>>>> Senior Software Engineer - Data Technologies Team >>>>>>>>>> WSO2 Inc. http://wso2.com >>>>>>>>>> >>>>>>>>>> email: lasan...@wso2.com >>>>>>>>>> mobile: (+94) 71 5247551 >>>>>>>>>> >>>>>>>>>> _______________________________________________ >>>>>>>>>> Architecture mailing list >>>>>>>>>> Architecture@wso2.org >>>>>>>>>> https://mail.wso2.org/cgi-bin/mailman/listinfo/architecture >>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> -- >>>>>>>>> >>>>>>>>> *Tharindu Dharmarathna*Associate Software Engineer >>>>>>>>> WSO2 Inc.; http://wso2.com >>>>>>>>> lean.enterprise.middleware >>>>>>>>> >>>>>>>>> mobile: *+94779109091 <%2B94779109091>* >>>>>>>>> >>>>>>>>> _______________________________________________ >>>>>>>>> Architecture mailing list >>>>>>>>> Architecture@wso2.org >>>>>>>>> https://mail.wso2.org/cgi-bin/mailman/listinfo/architecture >>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>> >>>>>>> >>>>>>> -- >>>>>>> *Lasantha Fernando* >>>>>>> Senior Software Engineer - Data Technologies Team >>>>>>> WSO2 Inc. http://wso2.com >>>>>>> >>>>>>> email: lasan...@wso2.com >>>>>>> mobile: (+94) 71 5247551 >>>>>>> >>>>>>> _______________________________________________ >>>>>>> Architecture mailing list >>>>>>> Architecture@wso2.org >>>>>>> https://mail.wso2.org/cgi-bin/mailman/listinfo/architecture >>>>>>> >>>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> >>>>>> *Tharindu Dharmarathna*Associate Software Engineer >>>>>> WSO2 Inc.; http://wso2.com >>>>>> lean.enterprise.middleware >>>>>> >>>>>> mobile: *+94779109091 <%2B94779109091>* >>>>>> >>>>> >>>>> >>>>> >>>>> -- >>>>> >>>>> *Tharindu Dharmarathna*Associate Software Engineer >>>>> WSO2 Inc.; http://wso2.com >>>>> lean.enterprise.middleware >>>>> >>>>> mobile: *+94779109091 <%2B94779109091>* >>>>> >>>> >>>> >>>> >>>> -- >>>> *Janaka Ranabahu* >>>> Associate Technical Lead, WSO2 Inc. >>>> http://wso2.com >>>> >>>> >>>> *E-mail: jan...@wso2.com <http://wso2.com>**M: **+94 718370861 >>>> <%2B94%20718370861>* >>>> >>>> Lean . Enterprise . Middleware >>>> >>> >>> >>> >>> -- >>> *Kishanthan Thangarajah* >>> Associate Technical Lead, >>> Platform Technologies Team, >>> WSO2, Inc. >>> lean.enterprise.middleware >>> >>> Mobile - +94773426635 >>> Blog - *http://kishanthan.wordpress.com >>> <http://kishanthan.wordpress.com>* >>> Twitter - *http://twitter.com/kishanthan >>> <http://twitter.com/kishanthan>* >>> >> >> >> >> -- >> Lochana Ranaweera >> Intern Software Engineer >> WSO2 Inc: http://wso2.com >> Blog: https://lochanaranaweera.wordpress.com/ >> Mobile: +94716487055 <http://tel%2B716487055> >> >> > > > -- > > *Tharindu Dharmarathna*Associate Software Engineer > WSO2 Inc.; http://wso2.com > lean.enterprise.middleware > > mobile: *+94779109091 <%2B94779109091>* > > _______________________________________________ > Architecture mailing list > Architecture@wso2.org > https://mail.wso2.org/cgi-bin/mailman/listinfo/architecture > >
_______________________________________________ Architecture mailing list Architecture@wso2.org https://mail.wso2.org/cgi-bin/mailman/listinfo/architecture