All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.netflix.dyno.demo.redis.DynoDistributedCounterDemo Maven / Gradle / Ivy

/*******************************************************************************
 * Copyright 2011 Netflix
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 ******************************************************************************/
package com.netflix.dyno.demo.redis;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;

import com.netflix.dyno.recipes.counter.DynoCounter;
import com.netflix.dyno.recipes.counter.DynoJedisBatchCounter;
import com.netflix.dyno.recipes.counter.DynoJedisPipelineCounter;
import com.netflix.dyno.recipes.counter.DynoJedisCounter;

/**
 * Demo of {@link DynoCounter} implementations.
 */
public class DynoDistributedCounterDemo extends DynoJedisDemo {

    private final List counters = new ArrayList();

    public DynoDistributedCounterDemo(String localDC) {
        super(localDC);
    }

    private void runMultiThreadedCounter(final int numCounters) throws Exception {
        for (int i = 0; i < numCounters; i++) {
            counters.add(new DynoJedisCounter(client.getConnPool().getName() + "-counter", client));
        }

        this.runMultiThreaded(5000, false, 1, 2);
    }

    private void runMultiThreadedPipelineCounter(final int numCounters) throws Exception {
        for (int i = 0; i < numCounters; i++) {
            DynoJedisPipelineCounter counter =
                    new DynoJedisPipelineCounter(client.getConnPool().getName() +
                            "-async-counter-" + i, client);
            counter.initialize();
            counters.add(counter);
        }


        this.runMultiThreaded(50000, false, 1, 2);
    }

    private void runSingleThreadedPipelineCounter() throws Exception {

        DynoJedisPipelineCounter counter = new DynoJedisPipelineCounter("demo-single-async", client);

        counter.initialize();

        System.out.println("counter is currently set at " + counter.get());

        for (int i = 0; i < 10000; i++) {
            counter.incr();
        }

        counter.sync();

        System.out.println("Total count => " + counter.get());

        counter.close();

        System.out.println("Cleaning up keys");
        cleanup(counter);
    }

    private void runMultiThreadedBatchCounter(int numCounters) throws Exception {
        for (int i = 0; i < numCounters; i++) {

            DynoJedisBatchCounter counter = new DynoJedisBatchCounter(
                    client.getConnPool().getName() + "-batch-counter", // key
                    client,                                            // client
                    500L                                               // flush period
            );

            counter.initialize();
            counters.add(counter);
        }

        this.runMultiThreaded(-1, false, 1, 2);
    }

    @Override
    protected void startWrites(final int ops,
                               final int numWriters,
                               final ExecutorService threadPool,
                               final AtomicBoolean stop,
                               final CountDownLatch latch,
                               final AtomicInteger success,
                               final AtomicInteger failure) {

        final Random random = new Random(System.currentTimeMillis());
        final int numCounters = counters.size() > 1 ? counters.size() -1 : 1;

        for (int i = 0; i < numWriters; i++) {

            threadPool.submit(new Callable() {

                @Override
                public Void call() throws Exception {
                    int localCount = 0;
                    while (!stop.get() && (localCount < ops || ops == -1)) {
                        try {
                            int index = random.nextInt(numCounters);

                            DynoCounter counter = counters.get(index);

                            counter.incr();
                            success.incrementAndGet();

                            // If we are pipelining, sync every 10000 increments
                            if (++localCount % 10000 == 0 &&
                                    counter instanceof DynoJedisPipelineCounter) {
                                System.out.println("WRITE - sync() " + Thread.currentThread().getName());
                                ((DynoJedisPipelineCounter) counter).sync();
                            }
                        } catch (Exception e) {
                            System.out.println("WRITE FAILURE: " + Thread.currentThread().getName() + ": " + e.getMessage());
                            e.printStackTrace();
                            failure.incrementAndGet();
                        }
                    }

                    for (DynoCounter counter : counters) {
                        if (counter instanceof DynoJedisPipelineCounter) {
                            System.out.println(Thread.currentThread().getName() + " => localCount = " + localCount);
                            ((DynoJedisPipelineCounter) counter).sync();
                        }
                    }

                    latch.countDown();
                    System.out.println(Thread.currentThread().getName() + " => Done writes");
                    return null;
                }
            });

        }
    }

    @Override
    protected void startReads(final int nKeys,
                              final int numReaders,
                              final ExecutorService threadPool,
                              final AtomicBoolean stop,
                              final CountDownLatch latch,
                              final AtomicInteger success,
                              final AtomicInteger failure,
                              final AtomicInteger emptyReads) {

        threadPool.submit(new Callable() {
            @Override
            public Void call() throws Exception {

                if (counters != null && counters.get(0) instanceof DynoJedisPipelineCounter) {
                    latch.countDown();
                    return null;
                }

                while (!stop.get()) {
                    long result = 0L;

                    for (DynoCounter counter : counters) {
                        result += counter.get();
                    }

                    System.out.println("counter value ==> " + result);
                    Thread.sleep(1000);
                }
                latch.countDown();
                return null;
            }
        });
    }

    @Override
    protected void executePostRunActions() {
        long result = 0L;
        for (DynoCounter counter : counters) {
            if (counter instanceof DynoJedisPipelineCounter) {
                ((DynoJedisPipelineCounter) counter).sync();
            }
            result += counter.get();
        }

        System.out.println("COUNTER value ==> " + result);
    }

    @Override
    public void cleanup(int nKeys) {
        try {
            for (DynoCounter counter : counters) {
                cleanup(counter);
            }

            for (int i = 0; i < counters.size(); i++) {
                counters.remove(i);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public void cleanup(DynoCounter counter) throws Exception {
        for (String key: counter.getGeneratedKeys()) {
            System.out.println("deleting key: " + key);
            client.del(key);
            counter.close();
        }
    }

    /**
     * Entry point to run {@link DynoCounter} demos
     *
     * @param args Should contain:
     *             
    dynomite_cluster_name
*
    # of distributed counters (optional)
*/ public static void main(String[] args) { DynoDistributedCounterDemo demo = new DynoDistributedCounterDemo("us-east-1e"); int numCounters = (args.length == 2) ? Integer.valueOf(args[1]) : 1; try { demo.initWithRemoteClusterFromEurekaUrl(args[0], 8102); //demo.runMultiThreadedCounter(numCounters); //demo.runMultiThreadedPipelineCounter(numCounters); //demo.runSingleThreadedPipelineCounter(); demo.runMultiThreadedBatchCounter(numCounters); } catch (Exception ex) { ex.printStackTrace(); } finally { demo.stop(); System.out.println("Done"); } } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy