Example #1
0
    async def test_producer_and_consumer_consume_with_bytes(self):
        class ByteSerializer(Serializer):
            def serialize(self, msg):
                result = str.encode(msg)
                return result

            def deserialize(self, data):
                return data

        class ByteProcessor(Processor, NetstringAggregator, ByteSerializer):
            pass

        processor = ByteProcessor()

        async with Producer(
            stream_name=self.stream_name, endpoint_url=ENDPOINT_URL, processor=processor
        ) as producer:

            for x in range(0, 2):
                await producer.put(f"{x}")

            await producer.flush()

            results = []

            checkpointer = MemoryCheckPointer(name="test")

            async with Consumer(
                stream_name=self.stream_name,
                endpoint_url=ENDPOINT_URL,
                processor=processor,
                checkpointer=checkpointer,
            ) as consumer:
                async for item in consumer:
                    results.append(item)
                    await checkpointer.checkpoint(
                        shard_id=consumer.shards[0]["ShardId"], sequence="seq"
                    )

                async for item in consumer:
                    results.append(item)

            self.assertEquals(len(results), 2)

            await checkpointer.close()

            self.assertEquals(len(checkpointer.get_all_checkpoints()), 1)
Example #2
0
    async def test_consumer_checkpoint(self):

        checkpointer = MemoryCheckPointer(name="test")

        results = []

        async with Producer(
                stream_name=self.STREAM_NAME_SINGLE_SHARD,
                processor=StringProcessor(),
        ) as producer:

            async with Consumer(
                    stream_name=self.STREAM_NAME_SINGLE_SHARD,
                    checkpointer=checkpointer,
                    processor=StringProcessor(),
                    iterator_type="LATEST",
            ) as consumer:

                # Manually start
                await consumer.start_consumer()

                await producer.put("test")

                await producer.flush()

                for i in range(3):
                    async for item in consumer:
                        results.append(item)

            checkpoints = checkpointer.get_all_checkpoints()

            # Expect 1 as only 1 shard
            self.assertEquals(1, len(checkpoints))

            self.assertIsNotNone(checkpoints[list(
                checkpoints.keys())[0]]["sequence"])

            self.assertListEqual(results, ["test"])
Example #3
0
    async def test_memory_checkpoint(self):
        # first consumer
        checkpointer = MemoryCheckPointer(name="test")

        consumer_a = Consumer(
            stream_name=None,
            checkpointer=checkpointer,
            max_shard_consumers=1,
            endpoint_url=ENDPOINT_URL,
        )

        self.patch_consumer_fetch(consumer_a)

        consumer_a.shards = [{"ShardId": "test-1"}, {"ShardId": "test-2"}]

        await consumer_a.fetch()

        shards = [s["ShardId"] for s in consumer_a.shards if s.get("stats")]

        # Expect only one shard assigned as max = 1
        self.assertEqual(["test-1"], shards)

        # second consumer (note: max_shard_consumers needs to be 2 as uses checkpointer to get allocated shards)

        consumer_b = Consumer(
            stream_name=None,
            checkpointer=checkpointer,
            max_shard_consumers=2,
            endpoint_url=ENDPOINT_URL,
        )

        self.patch_consumer_fetch(consumer_b)

        consumer_b.shards = [{"ShardId": "test-1"}, {"ShardId": "test-2"}]

        await consumer_b.fetch()

        shards = [s["ShardId"] for s in consumer_b.shards if s.get("stats")]

        # Expect only one shard assigned as max = 1
        self.assertEqual(["test-2"], shards)
Example #4
0
    async def test_producer_and_consumer_consume_with_checkpointer_and_latest(
            self):
        async with Producer(stream_name=self.stream_name,
                            endpoint_url=ENDPOINT_URL) as producer:

            await producer.put("test.A")

            results = []

            checkpointer = MemoryCheckPointer(name="test")

            async with Consumer(
                    stream_name=self.stream_name,
                    endpoint_url=ENDPOINT_URL,
                    checkpointer=checkpointer,
                    iterator_type="LATEST",
            ) as consumer:

                async for item in consumer:
                    results.append(item)

            # Expect none as LATEST
            self.assertEquals([], results)

            checkpoints = checkpointer.get_all_checkpoints()

            # Expect 1 as only 1 shard
            self.assertEquals(1, len(checkpoints))

            # none as no records yet (using LATEST)
            self.assertIsNone(checkpoints[list(
                checkpoints.keys())[0]]["sequence"])

            results = []

            log.info("checkpointer checkpoints: {}".format(checkpoints))

            log.info("Starting consumer again..")

            async with Consumer(
                    stream_name=self.stream_name,
                    endpoint_url=ENDPOINT_URL,
                    checkpointer=checkpointer,
                    iterator_type="LATEST",
                    sleep_time_no_records=0.5,
            ) as consumer:

                # Manually start
                await consumer.start_consumer()

                await producer.put("test.B")

                await producer.flush()

                log.info("waiting..")

                await asyncio.sleep(1)

                log.info("about to consume..")

                async for item in consumer:
                    results.append(item)

            self.assertEquals(["test.B"], results)

            checkpoints = checkpointer.get_all_checkpoints()

            log.info("checkpointer checkpoints: {}".format(checkpoints))

            # expect not None as has processed records
            self.assertIsNotNone(checkpoints[list(
                checkpoints.keys())[0]]["sequence"])

            # now add some records
            for i in range(0, 10):
                await producer.put("test.{}".format(i))

            await producer.flush()

            await asyncio.sleep(1)

            results = []

            async with Consumer(
                    stream_name=self.stream_name,
                    endpoint_url=ENDPOINT_URL,
                    checkpointer=checkpointer,
                    iterator_type="LATEST",
                    sleep_time_no_records=0.5,
            ) as consumer:

                async for item in consumer:
                    results.append(item)

            # Expect results as checkpointer resumed from prior sequence
            self.assertEquals(10, len(results))