public synchronized Topology addSource(final String name,
                                           final Deserializer<?> keyDeserializer,
                                           final Deserializer<?> valueDeserializer,
                                           final Pattern topicPattern) {
        internalTopologyBuilder.addSource(null, name, null, keyDeserializer, valueDeserializer, topicPattern);
        return this;
    }
Add a new source that consumes from topics matching the given pattern and forwards the records to child processor
and/or sink nodes.
The source will use the specified key and value deserializers.
The provided de-/serializers will be used for all matched topics, so care should be taken to specify patterns for
topics that share the same key-value data format.
The default {@link TimestampExtractor} as specified in the {@link StreamsConfig config} is used.

@param name               the unique name of the source used to reference this node when
                          {@link #addProcessor(String, ProcessorSupplier, String...) adding processor children}
@param keyDeserializer    key deserializer used to read this source, if not specified the default
                          key deserializer defined in the configs will be used
@param valueDeserializer  value deserializer used to read this source,
                          if not specified the default value deserializer defined in the configs will be used
@param topicPattern       regular expression pattern to match Kafka topics that this source is to consume
@return itself
@throws TopologyException if processor is already added or if topics have already been registered by name
streams/src/main/java/org/apache/kafka/streams/Topology.java