18

ZeroC's ICE (www.zeroc.com) looks interesting and I am interested in looking at it and comparing it to our existing software that uses WCF. In particular, our WCF app uses server callbacks (via HTTP).

Anybody who's compared them? How did it go? I'm particularly interested in the performance aspect, since interoperability isn't much of a concern for us right now. Thanks!

stephenbayer
  • 12,373
  • 15
  • 63
  • 98
cruizer
  • 6,103
  • 2
  • 27
  • 34

5 Answers5

14

I did a very terse review of ICE a few years ago, and although I haven't compared them directly before, having reasonable knowledge of WCF my thoughts might have some relevance.

Firstly, it's not entierely fair to compare WCF with ICE as WCF as ICE is a specific remote communication mechanism and WCF is a higher level remote communications framework.

While WCF is often thought of as implementing SOAP web services, and that is indeed its main use to date, it can also be used for implementing remote services using all manner of encodings and transport channels, which means it can theoretically be used for performant comms between applications.

In comparison, ICE is a cross-platform remote communicaton mechanism that uses binary encoding for performant communications between applications. It's something of a simplified evolution of CORBA and is more directly comparable to CORBA, DCOM, .NET Remoting, and JNI.

However, even though there's no direct correspondence between ICE and WCF, if you need your .NET app to communicate remotely then they're both contenders. Some of the decision points you might want to consider include:

  • Resourcing. It'll be easier to find developers with WCF experience than ICE experience.

  • Performance. If you want performance then ICE performs fast, but WCF can also be used in a performant configuration. Alternatively, .NET Remoting can provide very good performance, and whatever the MS-sponsored benchmarks say I've seen it outperform WCF by 10%.

  • Cross-platform. If you need to communicate with non-Windows applications then you're limited with the WCF options you can use. In addition, since every SOAP stack seems to implement the standards differently it can be a pain creating truly generic Web Services (though WS-I helps)

If you don't need every ounce of performance from day one, then I'd personally plump for WCF to start with, and then consider ICE if performance ever becomes critical. Even then it might be cheaper to scale out your service boxes than it is to move to ICE, and if you don't have any exotic cross-platform needs then you could always look at reconfiguring WCF for binary encoding etc

Ubiguchi
  • 3,066
  • 1
  • 25
  • 24
  • thanks. actually our current system is already using WCF (wsDualHttpBinding) that is why I am also considering ICE, if it can deliver better performance or scalability. – cruizer Sep 23 '08 at 00:15
  • 1
    My own tests for the best-case .NET Remoting situation (in-process cross-AppDomain method calls) show that WCF is indeed faster in that particular situation. YMMV. – Mark Oct 25 '10 at 21:51
  • 1
    We have used ICE in load balancing mode, which required no changes to the server code. It automatically pushed updates to all of the nodes when we did an update. WCF does not support any of this. – Contango Feb 28 '11 at 21:50
11

Michi Henning from ZeroC has recently published a white paper on just this topic -- "Choosing Middleware: Why Performance and Scalability do (and do not) Matter". It compares Ice, WCF (binary & SOAP), and RMI with various performance metrics, platforms, languages, etc. There's more information on Michi's blog, but the white paper is also quite readable, with all the standard caveats of any benchmark.

Disclaimer: I've used Ice and RMI extensively, but never WCF.

Josh
  • 201
  • 2
  • 5
  • 1
    The whitepaper was updated recently (February 16, 2011) http://www.zeroc.com/forums/announcements/5250-performance-white-paper-updated-ice-3-4-1-a.html – MKroehnert May 03 '11 at 14:07
2

Apache Thrift is another contender to ICE and WCF. It was developed and open sourced by Facebook. Apache Thrift is nice in some ways because its not only extremely efficient on the encoding side, it also supports adding of fields to structures without breaking all of the clients (something we found extremely useful for our projects).

Google Protocol Buffers would seem not really a contender as it doesn't mention .NET support on the home page. However, some community addons support C#. In addition, ICE provides emulation for Google Protocol Buffers if you're working with existing services.

Contango
  • 76,540
  • 58
  • 260
  • 305
  • 2
    As a longtime ICE user, I have also started looking into Thrift as a possible replacement for ICE. it's not too bad actually, and in many ways it is far simpler. I haven't measured the performance but I'd expect it to be similar if not better for marshaling based on the generated code. – Andrew McVeigh May 18 '12 at 14:29
1

Data point: we just converted a callback multi-platform and multi-language project from Ice to Thrift with pretty good results. Ice does a lot for you, so we had to implement disconnection listeners, connection events, etc. ourselves. And in one case we got bit in the proverbial with a big object lock that Ice was letting us get away with -- this caused a deadlock in the Thrift server but it was easily fixed by less lazy coding on the C# side.

I've just finished benchmarking, and in our application anything that pushes large amounts of data is faster than, or on par with, Ice. Shorter messages with more over-head (i.e., a "heartbeat" that updates a status over the protocol) is a bit slower.

The most important bit was that in order to implement the callback service correctly we had to extend Thrift interfaces and define our own protocol, along with a Thrift "Processor" and callback client-server. But I freely admit our application is /very/ special. The existing protocols and servers should be sufficient. But extending them, even to use multiplex sockets from .Net, was not terribly difficult.

0

We are using ICE to integrate modules written in both C++, Java and C#. The nice thing is that our server can access components on remote machines as well, so if we need more performance we can shift processing to different machines.

I've used both WCF and ICE, and I'd say that ICE is cleaner on the implementation side. ICE also has very detailed and readable documentation.

ICE supports some things that WCF cannot do, including load balancing, automated remote client updates, etc.

Contango
  • 76,540
  • 58
  • 260
  • 305