What Is Fudge?Fudge came out of a desire for a system to encode data which is:
- Hierarchical so that you can represent common document idioms (XML or JSON) using it
- Typesafe by storing the type of data along with the payload.
- Binary for compactness on the wire or on disk.
- Self-Describing in its contents so that you can introspect a message without knowing anything about any schema used for its production
- Google Protocol Buffers and Thrift are great if you have access to to the schema, and know what the type of messages on a particular communications channel are. But because they're not inherently self-describing, you can't build interesting middleware around their flow.
- XML and JSON are big (if you don't gzip them) and slow (if you do). Plus by being text-based, you have to convert everything to and from text.
- ASN.1 is conceptually nice in a lot of respects, but it's become such a niche that the tooling is utterly rubbish, and I don't see it getting any better.
TibrvMsgsystem, but couldn't use it because it's proprietary, and the implementations are surprisingly slow for something designed for low-latency messaging.
What Is The Fudge Project?The Fudge project consists of the following major components:
- An Encoding Specification, conceptually similar to ASN.1 BER, DER, or PER, which specifies how to encode data in a linear sequence of bytes.
- A set of Reference Implementations, which adhere strictly to the encoding specification and provide access to Fudge-encoded data in a number of programming languages.
- Tools to make it easy to work with data encoded in the Fudge format.
Project StatusI'm not going to kid you: this is a very early stage project. We have Java and C# reference implementations (and the C# one, for example, is more advanced than the Java one in a lot of respects, mostly because it's leveraging relatively new features in the C# language). We have a wiki and Jira installation. We have code up in Github. But that's about it. Don't let me mislead you: the Java reference implementation, for example, is rock-solid in stability and very good in performance; we use it daily here at OpenGamma. But we don't have polished releases and distributions and everything else as of yet. That will come, but we wanted to get the code out there as soon as we reasonably could.
LicenseWe're releasing the code under the APLv2 because we believe that it's the best type of license for this type of work: it's developer friendly, as well as employer friendly. The specification is free to use for everyone. If you're going to use the ideas but not the full specification we'd ask you to not call your project Fudge Compliant , but anyone can create their own Fudge implementation using whatever license they want.
Next StepsIf you're interested, take a look at the wiki, grab the code, and take a look. I hope you find it useful. From our perspective, we're going to continue to develop the system and grow it.
Footnotes: Fast Unstructured Data Generic Encoding
: Fair Disclosure: we are considering getting a trademark on the use of the word Fudge for messaging to allow us to ensure that only compliant implementations can use the name.