Loading skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractAsyncMember.java +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; Loading @@ -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 { Loading skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractAsyncMemberProvider.java +7 −4 Original line number Diff line number Diff line Loading @@ -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; } } skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractHashMessage.java 0 → 100644 +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; } } skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/selector/HashCodeSelector.java 0 → 100644 +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); } } skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/queue/EndOfBatchCommand.java 0 → 100644 +7 −0 Original line number Diff line number Diff line package com.a.eye.skywalking.collector.queue; /** * @author pengys5 */ public class EndOfBatchCommand { } Loading
skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractAsyncMember.java +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; Loading @@ -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 { Loading
skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractAsyncMemberProvider.java +7 −4 Original line number Diff line number Diff line Loading @@ -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; } }
skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractHashMessage.java 0 → 100644 +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; } }
skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/selector/HashCodeSelector.java 0 → 100644 +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); } }
skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/queue/EndOfBatchCommand.java 0 → 100644 +7 −0 Original line number Diff line number Diff line package com.a.eye.skywalking.collector.queue; /** * @author pengys5 */ public class EndOfBatchCommand { }