Class BatchBundler

  • All Implemented Interfaces:
    Bundler

    public class BatchBundler
    extends BaseBundler
    Bundler based on BATCH. Batches messages, keeping a BaseBundler.max_size for every destination. When the accumulated size of the messages for a given destination P would exceed max_bytes, a MessageBatch is created and sent to P.
    Additionally, a timer runs every flush_interval milliseconds, sending messages whose size hasn't yet reached max_size.
    Contrary to TransferQueueBundler, which maintains a max_size for all messages, BatchBundler maintains it for every destination separately. This causes batches to be fuller than with TransferQueueBundler: assuming 4 members, everyone sending to everyone else, and max_size = 60000: with TransferQueueBundler, a batch is sent with ~15'000 bytes of messages (60'000/4), but with BatchBundler, it has ~60'000 bytes. Fuller batches means more amortization of costs of handling single messages.
    Since:
    5.2
    Author:
    Bela Ban
    • Field Detail

      • flush_interval

        protected long flush_interval
      • max_batch_size

        public int max_batch_size
      • local_addr

        protected volatile Address local_addr
      • num_msgs_sent

        protected long num_msgs_sent
      • num_ebs_sent

        protected long num_ebs_sent
      • num_ebs_sent_due_to_full_queue

        protected long num_ebs_sent_due_to_full_queue
      • num_ebs_sent_due_to_max_number_of_msgs

        protected long num_ebs_sent_due_to_max_number_of_msgs
      • num_ebs_sent_due_to_timeout

        protected long num_ebs_sent_due_to_timeout
      • running

        protected volatile boolean running
      • flush_task

        protected java.util.concurrent.Future<?> flush_task
    • Constructor Detail

      • BatchBundler

        public BatchBundler()
    • Method Detail

      • avgBatchSize

        public double avgBatchSize()
      • send

        public void send​(Message msg)
                  throws java.lang.Exception
        Specified by:
        send in interface Bundler
        Overrides:
        send in class BaseBundler
        Throws:
        java.lang.Exception
      • getQueueSize

        public int getQueueSize()
        Description copied from interface: Bundler
        If the bundler has a queue and it should be managed by a queuing discipline (like Random Early Detection), then return the number of elements in the queue, else -1. In the latter case, the queue won't be managed.
        This method needs to be fast as it might get called on every message to be sent.
        Specified by:
        getQueueSize in interface Bundler
        Overrides:
        getQueueSize in class BaseBundler
      • _send

        protected void _send​(Message msg)
      • startFlushTask

        protected void startFlushTask()
      • stopFlushTask

        protected void stopFlushTask()
      • flush

        public void flush()