Git Product home page Git Product logo

infinitymq's People

Contributors

cbaxter avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

Forkers

captaincodeman

infinitymq's Issues

Support custom message headers.

MessageWriter currently adds a 'Type' header to all messages sent; eventually will need to support custom message headers.

ZMTP/1.1 support

InfinityMQ should support ZeroMQ Message Transport Protocol/1.1. The spec is listed as "Raw" (i.e., not stable), but it will likely become stable when zmq 3.1 is officially released in a few months.

This will allow IMQ apps to interact with anything built on ZMQ, which is a major advantage for heterogeneous deployment scenarios.

Intra-process communication doesn't need to use ZMTP, although it could. ZMTP will be most useful for inter-process and networked communication.

Allow for multiple Bind/Connect calls on single channel

Allow for multiple bindings or connect calls on a single channel to various end points. Should be able to bind multiple endpoints such as TCP/IPC etc through a single channel. Should not be able to intermix bind and connect calls on same channel.

Option Configuration

Several options should be made to be configurable (defaulted) at the App.config/Web.config level.

Examples.

  • Socket.SendBufferSize
  • Socket.ReceiveBufferSize
  • BufferedFrameWriter.BufferSize
  • BufferedFrameReader.BufferSize
  • etc.

License

We should pick an open source license for IMQ (∞MQ?).

Options:

  • LGPL — allows for dynamic linking in proprietary code, but disallows modification and re-distribution under more a more permissive license. Any forks or derived works would have to remain LGPL or transition to GPL.
  • AGPL — similar to LGPL, but if users run a custom fork on a server (i.e., used, but not explicitly distributed), they are required to release their modifications under a compatible license.
  • Apache — unlike *GPL, does not require modified versions to be distributed with the same license. In theory, this would allow someone to sell modified, closed-source versions of IMQ as long as they retained the original Apache NOTICE file with our names in it. At least, that is my non-lawyer understanding.
  • MIT or BSD — similar to Apache, in that modified versions can be distributed/sold with any license as long as the original copyright notice with our names is maintained.

ZeroMQ uses a modified LGPL that also allows static linking to proprietary code, but this doesn't really apply in .NET land.

MongoDB uses AGPL for the database itself and Apache for the drivers. 10gen also sells commercial licenses for the database for those who need to tweak but don't want to release their changes.

I'm leaning toward either LGPL or AGPL. What are your thoughts?

Type header optimization

The current Type header format in MessageWriter should be profiled and improved if possible/necessary.

The performance impact of using a versionless AQN may not matter with large messages, but it could become an issue for small messages, especially if a compact binary serializer is used (i.e., protobuf).

Required/desirable properties for Type encoding:

  • Deterministic and consistent, even across process & machine boundaries
  • Filterable - should be in such a format that a subscriber could easily ignore messages based on the type header without a lot of computation
  • Small and fast

Implement BufferedFrameReader/BufferedFrameWriter

To facilitate maximum throughput, create buffered frame reader/writer classes.

Expected Results:

Named Pipes (4096 bytes x 1,000,000)

PUB/SUB Channel

  • Message Latency = 3.16 [us]
  • Message Throughput = 158211.52 [msg/s]
  • Data Throughput = 5184.28 [Mb/s]

Create Performance Benchmark Application

Create basic console application to allow for measuring benchmarks of different InfinityMQ setups.

  • Should be single process
  • Should be easy to add new benchmarks (i.e., implement IBenchmark)
  • Initially populate with baseline tests.

Implement BufferPool (or consider WCF BufferManager?)

Implement buffer pool to prevent reallocation of byte arrays for temporary message buffers.

Due to each write on a named pipe being treated as a single message; don't want to write out frames individually (seriously degrades performance). Implement buffer pool to allow for more efficient memory management.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.