During the holidays I began playing with a port of the Zero Knowledge code in ServiceWire but using NetMQ, the .NET native port of ZeroMQ. I’ve named this fun little project MessageWire and I’m happy to announce the first release and show off this new logo.
MessageWire is a Zero Knowledge authentication and encryption wrapper for a NetMQ Dealer socket (client) Router socket (server) combination.
Get the code here. Get the NuGet package here. I’ll be blogging more about it as the code evolves. It’s early days so use at your own risk.
I am pleased to see this milestone of 10,000 downloads in the short history of ServiceMq and its underlying communication library ServiceWire, a faster and simpler alternative to WCF .NET to .NET RPC. And the source code for all three can be found on GitHub here.
Over the past few weeks both libraries have been improved.
ServiceMq improvements include:
- Options for the persistence of messages asynchronously to improve overall throughput when message traffic is high
- ReceiveBulk and AcceptBulk methods were introduced
- Message caching was refactored to improve performance and limit memory use in scenarios where large numbers of messages are sent and must wait for a destination to become available or received and must wait to be consumed
- Faster asynchronous file deletion was added which eliminates the standard File.Delete’s permission demand on every message file delete
- Asynchronous append file logging was added to improve throughput
- The FastFile class was refactored to support IDisposable and now dedicates a single thread each to asynchronous delete, append and write operations
- Upgraded to ServiceWire 1.6.3
ServiceWire has had two minor but important bugs fixed:
- Code was refactored to properly dispose of resources when a connection failure occurs.
- Previously if the host was not hosting the same assembly version of the interface being used, the connection would hang. This scenario now properly throws an identifiable exception on the client and disposes of the underlying socket or named pipe stream.
Real World Use
In the last month or so, I have had the opportunity to use both of these libraries extensively at work. All of the recent improvements are a direct or indirect result of that real world use. Without disclosing work related details, I believe it is safe to say that these libraries are moving hundreds of messages per second and in some cases 30GB of data between two machines in around three minutes across perhaps 300 RPC method invocations. Some careful usage has been required given our particular use cases in order to reduce connection contention from many thousands of message writer threads across a pool of servers all talking to a single target server. I’ve no doubt that a little fine tuning on the usage side may be required, but overall I’m very happy with the results.
I hope you enjoy these libraries and please contact me if you find any problems with them or need additional functionality. Better yet, jump onto GitHub and submit a pull request of your own. I am happy to evaluate and accept well thought out requests that are in line with my vision for keeping these libraries lightweight and easy to use.
One other note
I recently published ServiceMock, a tiny experimental mocking library that has surprisingly been downloaded over 500 times. If you’re one of the crazy ones, I’d love to hear from you and what you think of it.
About 18 months ago, I started some fun open source projects shared on GitHub and published on NuGet where I just crept over the 4,000 downloads mark. Wahoo! Of course, this is not really a very high number in comparison with the most popular packages on NuGet.org but I’m glad there are some people enjoying some benefit from using my work, and I don’t mind patting myself on the back just a little..
Here are my favorites:
DuoVia.FuzzyStrings--A collection of fuzzy string algorithms:
- Dice coefficient based on bigrams
- Levenshtein distance with transposition
- LCS (longest common subsequence)
- Double metaphone.
ServiceWire--A fast and light weight service host and dynamic client library that simplifies the development and use of high performance remote procedure call (RPC) communication between .NET processes over named pipes or TCP/IP. Supports the following:
- Out and ref parameters
- Dynamic client proxy generation from service interface
- Fast serialization of most native types and arrays of those types
- Multiple service interface hosting on the same endpoint
- Aspect oriented interception with easy pre-, post- and exception handling cross cutting
ServiceRunner--Easiest way to turn a console app into a Windows Service but still debug as a console app.
DuoVia.Net.Distributed--A Distributed Task Parallel Processing Library for .NET.
DuoVia.MpiVisor--Distributed Parallel Computing for .NET.
I hope you’ll give one or more of them a try.