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*
_______________________________________________ Architecture mailing list Architecture@wso2.org https://mail.wso2.org/cgi-bin/mailman/listinfo/architecture