Cool down peoples! 

http://www.quickmeme.com/meme/35ovcy

Sebastian, don't think Sanne was being rude, he's just blunt and we need his 
bluntness :)

Sanne, be nice to Sebastian and get him a beer next time around ;)

Peace out! :)
--
Galder Zamarreño
Infinispan, Red Hat

> On 31 May 2017, at 09:38, Sebastian Laskawiec <slask...@redhat.com> wrote:
> 
> Hey Sanne,
> 
> Comments inlined.
> 
> Thanks,
> Sebastian
> 
> On Tue, May 30, 2017 at 5:58 PM Sanne Grinovero <sa...@infinispan.org> wrote:
> Hi Sebastian,
> 
> the "intelligent routing" of Hot Rod being one of - if not the main - reason 
> to use Hot Rod, I wonder if we shouldn't rather suggest people to stick with 
> HTTP (REST) in such architectures.
> 
> Several people have suggested in the past the need to have an HTTP smart load 
> balancer which would be able to route the external REST requests to the right 
> node. Essentially have people use REST over the wider network, up to reaching 
> the Infinispan cluster where the service endpoint (the load balancer) can 
> convert them to optimised Hot Rod calls, or just leave them in the same 
> format but routing them with the same intelligence to the right nodes.
> 
> I realise my proposal requires some work on several fronts, at very least we 
> would need:
>  - feature parity Hot Rod / REST so that people can actually use it
>  - a REST load balancer
> 
> But I think the output of such a direction would be far more reusable, as 
> both these points are high on the wish list anyway.
> 
> Unfortunately I'm not convinced into this idea. Let me elaborate...
> 
> It goes without saying that HTTP payload is simply larger and require much 
> more processing. That alone makes it slower than Hot Rod (I believe Martin 
> could provide you some numbers on that). The second arguments is that 
> switching/routing inside Kubernetes is bloody fast (since it's based on 
> iptables) and some cloud vendors optimize it even further (e.g. Google 
> Andromeda [1][2], I would be surprised if AWS didn't have anything similar). 
> During the work on this prototype I wrote a simple async binary proxy [3] and 
> measured GCP load balancer vs my proxy performance. They were twice as fast 
> [4][5]. You may argue whether I could write a better proxy. Probably I could, 
> but the bottom line is that another performance hit is inevitable. They are 
> really fast and they operate on their own infrastructure (load balancers is 
> something that is provided by the cloud vendor to Kubernetes, not the other 
> way around).
> 
> So with all that in mind, are we going to get better results comparing to my 
> proposal for Hot Rod? I dare to doubt, even with HTTP/2 support (which comes 
> really soon I hope). The second question is whether this new "REST load 
> balancer" will work better than a standard load balancer using round robin 
> strategy? Again I dare to doubt, even if you you're faster at routing request 
> to proper node, you introduce another layer of latency.
> 
> Of course the priority of this is up to Tristan but I definitely wouldn't 
> place it high on todo list. And before even looking at it I would recommend 
> taking Netty HTTP Proxy, putting it in the middle between real load balancer 
> and Infinispan app and measure performance with and without it. Another test 
> could be with 1 and 10 replicas to check the performance penalty of hitting 
> 100% and 10% requests into proper node.
> 
> [1] 
> https://cloudplatform.googleblog.com/2014/08/containers-vms-kubernetes-and-vmware.html
> [2] 
> https://cloudplatform.googleblog.com/2014/04/enter-andromeda-zone-google-cloud-platforms-latest-networking-stack.html
> [3] 
> https://github.com/slaskawi/external-ip-proxy/blob/Benchmark_with_proxy/Proxy/Proxy.go
> [4] 
> https://github.com/slaskawi/external-ip-proxy/blob/master/benchmark/results%20with%20proxy.txt
> [5] 
> https://github.com/slaskawi/external-ip-proxy/blob/master/benchmark/results%20with%20loadbalancer.txt
>  
> Not least having a "REST load balancer" would allow to deploy Infinispan as 
> an HTTP cache; just honouring the HTTP caching protocols and existing 
> standards would allow people to use any client to their liking,
> 
> Could you please give me an example how this could work? The only way that I 
> know is to plug a cache into reverse proxy. NGNIX supports pluggable Redis 
> for example [6].
> 
> [6] https://www.nginx.com/resources/wiki/modules/redis/
>  
> without us having to maintain Hot Rod clients and support it on many exotic 
> platforms - we would still have Hot Rod clients but we'd be able to pick a 
> smaller set of strategical platforms (e.g. Windows doesn't have to be in that 
> list).
> 
> As I mentioned before, I really doubts HTTP will be faster then Hot Rod in 
> any scenario.
>  
> Such a load balancer could be written in Java (recent WildFly versions are 
> able to do this efficiently) or it could be written in another language, all 
> it takes is to integrate an Hot Rod client - or just the intelligence of it- 
> as an extension into an existing load balancer of our choice.
> 
> As I mentioned before, with custom load balancer you're introducing another 
> layer of latency. It's not a free ride.
>  
> Allow me a bit more nit-picking on your benchmarks ;)
> As you pointed out yourself there are several flaws in your setup: "didn't 
> tune", "running in a VM", "benchmarked on a mac mini", ...if you know it's a 
> flawed setup I'd rather not publish figures, especially not suggest to make 
> decisions based on such results.
> 
> Why not? Infinispan is a public project and anyone can benchmark it using JMH 
> and taking decisions based on figures is always better than on intuition. 
> Even though there were multiple unknown factors involved in this benchmark 
> (this is why I pointed them out and asked to take the results with a grain of 
> salt), the test conditions for all scenarios were the same. For me this is 
> sufficient to give a general recommendation as I did. BTW, this 
> recommendation fits exactly my expectations (communication inside Kube the 
> fastest, LB per Pod a bit slower and no advanced routing the slowest). 
> Finally, the recommendation is based on a POC which by definition means it 
> doesn't fit all scenarios. You should always measure your system!
> 
> So unless you can prove the benchmark results are fundamentally wrong and I 
> have drawn wrong conclusions (e.g. a simple client is the fastest solution 
> whereas inside Kubernetes communication is the slowest), please don't use 
> "naaah, that's wrong" argument. It's rude.
>  
> At this level of design need to focus on getting the architecture right; it 
> should be self-speaking that your proposal of actually using intelligent 
> routing in some way should be better than not using it.
> 
> My benchmark confirmed this. But as always I would be happy to discuss some 
> alternatives. But before trying to convince me to "REST Router", please prove 
> that introducing a load balancer (or just a simple async proxy for start) 
> gives similar or better performance than a simple load balancer with round 
> robin strategy.
>  
> Once we'll have an agreement on a sound architecture, then we'll be able to 
> make the implementation efficient.
> 
> Thanks,
> Sanne
> 
> 
> 
> 
> On 30 May 2017 at 13:43, Sebastian Laskawiec <slask...@redhat.com> wrote:
> Hey guys!
> 
> Over past few weeks I've been working on accessing Infinispan cluster 
> deployed inside Kubernetes from the outside world. The POC diagram looks like 
> the following:
> 
> <pasted1.png>
> 
> As a reminder, the easiest (though not the most effective) way to do it is to 
> expose a load balancer Service (or a Node Port Service) and access it using a 
> client with basic intelligence (so that it doesn't try to update server list 
> based on topology information). As you might expect, this won't give you much 
> performance but at least you could access the cluster. Another approach is to 
> use TLS/SNI but again, the performance would be even worse.
> 
> During the research I tried to answer this problem and created "External IP 
> Controller" [1] (and corresponding Pull Request for mapping internal/external 
> addresses [2]). The main idea is to create a controller deployed inside 
> Kubernetes which will create (and destroy if not needed) a load balancer per 
> Infinispan Pod. Additionally the controller exposes mapping between internal 
> and external addresses which allows the client to properly update server list 
> as well as consistent hash information. A full working example is located 
> here [3].
> 
> The biggest question is whether it's worth it? The short answer is yes. Here 
> are some benchmark results of performing 10k puts and 10k puts&gets (please 
> take them with a big grain of salt, I didn't optimize any server settings):
>       • Benchmark app deployed inside Kuberenetes and using internal 
> addresses (baseline):
>               • 10k puts: 674.244 ±  16.654
>               • 10k puts&gets: 1288.437 ± 136.207
>       • Benchamrking app deployed in a VM outside of Kubernetes with basic 
> intelligence:
>               • 10k puts: 1465.567 ± 176.349
>               • 10k puts&gets: 2684.984 ± 114.993
>       • Benchamrking app deployed in a VM outside of Kubernetes with address 
> mapping and topology aware hashing:
>               • 10k puts: 1052.891 ±  31.218
>               • 10k puts&gets: 2465.586 ±  85.034
> Note that benchmarking Infinispan from a VM might be very misleading since it 
> depends on data center configuration. Benchmarks above definitely contain 
> some delay between Google Compute Engine VM and a Kubernetes cluster deployed 
> in Google Container Engine. How big is the delay? Hard to tell. What counts 
> is the difference between client using basic intelligence and topology aware 
> intelligence. And as you can see it's not that small.
> 
> So the bottom line - if you can, deploy your application along with 
> Infinispan cluster inside Kubernetes. That's the fastest configuration since 
> only iptables are involved. Otherwise use a load balancer per pod with 
> External IP Controller. If you don't care about performance, just use basic 
> client intelligence and expose everything using single load balancer.
> 
> Thanks,
> Sebastian 
> 
> [1] https://github.com/slaskawi/external-ip-proxy
> [2] https://github.com/infinispan/infinispan/pull/5164
> [3] https://github.com/slaskawi/external-ip-proxy/tree/master/benchmark
> 
> _______________________________________________
> infinispan-dev mailing list
> infinispan-dev@lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/infinispan-dev
> 
> _______________________________________________
> infinispan-dev mailing list
> infinispan-dev@lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/infinispan-dev
> -- 
> SEBASTIAN ŁASKAWIEC
> INFINISPAN DEVELOPER
> Red Hat EMEA
> 
> _______________________________________________
> infinispan-dev mailing list
> infinispan-dev@lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/infinispan-dev


_______________________________________________
infinispan-dev mailing list
infinispan-dev@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/infinispan-dev

Reply via email to