Commit 1061dd64 authored by pengys5's avatar pengys5
Browse files

add local analysis async layer

parent a941b023
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
package com.a.eye.skywalking.collector.actor;

import akka.actor.ActorRef;
import com.a.eye.skywalking.collector.queue.EndOfBatchCommand;
import com.a.eye.skywalking.collector.queue.MessageHolder;
import com.lmax.disruptor.RingBuffer;

@@ -20,6 +21,9 @@ public abstract class AbstractAsyncMember extends AbstractMember {
        Object message = event.getMessage();
        event.reset();
        receive(message);
        if (endOfBatch) {
            receive(new EndOfBatchCommand());
        }
    }

    public void beTold(Object message) throws Exception {
+7 −4
Original line number Diff line number Diff line
@@ -23,19 +23,22 @@ public abstract class AbstractAsyncMemberProvider<T extends EventHandler> extend
            throw new IllegalArgumentException("cannot createInstance() with nothing obtained from memberClass()");
        }

        Constructor memberConstructor = memberClass().getDeclaredConstructor(new Class<?>[]{RingBuffer.class, ActorRef.class});
        memberConstructor.setAccessible(true);

        // Specify the size of the ring buffer, must be power of 2.
        int bufferSize = queueSize();
        // Construct the Disruptor
        Disruptor<MessageHolder> disruptor = new Disruptor<MessageHolder>(MessageHolderFactory.INSTANCE, bufferSize, DaemonThreadFactory.INSTANCE);
        // Start the Disruptor, starts all threads running
        RingBuffer<MessageHolder> ringBuffer = disruptor.start();

        Constructor memberConstructor = memberClass().getDeclaredConstructor(new Class<?>[]{RingBuffer.class, ActorRef.class});
        memberConstructor.setAccessible(true);
        RingBuffer<MessageHolder> ringBuffer = disruptor.getRingBuffer();
        T member = (T) memberConstructor.newInstance(ringBuffer, actorRef);

        // Connect the handler
        disruptor.handleEventsWith(member);

        // Start the Disruptor, starts all threads running
        disruptor.start();
        return member;
    }
}
+16 −0
Original line number Diff line number Diff line
package com.a.eye.skywalking.collector.actor;

/**
 * @author pengys5
 */
public abstract class AbstractHashMessage {
    private int hashCode;

    public void setHashCode(String key) {
        this.hashCode = key.hashCode();
    }

    public int getHashCode() {
        return hashCode;
    }
}
+33 −0
Original line number Diff line number Diff line
package com.a.eye.skywalking.collector.actor.selector;

import com.a.eye.skywalking.collector.actor.AbstractHashMessage;
import com.a.eye.skywalking.collector.actor.AbstractWorker;
import com.a.eye.skywalking.collector.actor.WorkerRef;

import java.util.List;

/**
 * The <code>HashCodeSelector</code> is a simple implementation of {@link WorkerSelector}.
 * It choose {@link WorkerRef} by message hashcode, so it can use to send the same hashcode
 * message to same {@link WorkerRef}. Usually, use to database operate which avoid dirty data.
 *
 * @author pengys5
 */
public enum HashCodeSelector implements WorkerSelector {
    INSTANCE;

    /**
     * Use message hashcode to select {@link WorkerRef}.
     *
     * @param members given {@link WorkerRef} list, which size is greater than 0;
     * @param message the {@link AbstractWorker} is going to send.
     * @return the selected {@link WorkerRef}
     */
    @Override
    public WorkerRef select(List<WorkerRef> members, Object message) {
        AbstractHashMessage hashMessage = (AbstractHashMessage) message;
        int size = members.size();
        int selectIndex = Math.abs(hashMessage.getHashCode()) % size;
        return members.get(selectIndex);
    }
}
+7 −0
Original line number Diff line number Diff line
package com.a.eye.skywalking.collector.queue;

/**
 * @author pengys5
 */
public class EndOfBatchCommand {
}
Loading