the-algorithm/home-mixer/server/src/main/scala/com/twitter/home_mixer/module/TweetypieStaticEntitiesCacheClientModule.scala

71 lines
2.6 KiB
Scala

package com.twitter.home_mixer.module
import com.google.inject.name.Named
import com.google.inject.Provides
import com.twitter.conversions.DurationOps.RichDuration
import com.twitter.finagle.mtls.authentication.ServiceIdentifier
import com.twitter.finagle.stats.StatsReceiver
import com.twitter.home_mixer.param.HomeMixerInjectionNames.TweetypieStaticEntitiesCache
import com.twitter.inject.TwitterModule
import com.twitter.product_mixer.shared_library.memcached_client.MemcachedClientBuilder
import com.twitter.servo.cache.FinagleMemcache
import com.twitter.servo.cache.KeyTransformer
import com.twitter.servo.cache.KeyValueTransformingTtlCache
import com.twitter.servo.cache.ObservableTtlCache
import com.twitter.servo.cache.Serializer
import com.twitter.servo.cache.ThriftSerializer
import com.twitter.servo.cache.TtlCache
import com.twitter.tweetypie.{thriftscala => tp}
import javax.inject.Singleton
import org.apache.thrift.protocol.TCompactProtocol
object TweetypieStaticEntitiesCacheClientModule extends TwitterModule {
private val ScopeName = "TweetypieStaticEntitiesMemcache"
private val ProdDest = "/srv#/prod/local/cache/timelinescorer_tweet_core_data:twemcaches"
private val tweetsSerializer: Serializer[tp.Tweet] = {
new ThriftSerializer[tp.Tweet](tp.Tweet, new TCompactProtocol.Factory())
}
private val keyTransformer: KeyTransformer[Long] = { tweetId => tweetId.toString }
@Provides
@Singleton
@Named(TweetypieStaticEntitiesCache)
def providesTweetypieStaticEntitiesCache(
statsReceiver: StatsReceiver,
serviceIdentifier: ServiceIdentifier
): TtlCache[Long, tp.Tweet] = {
val memCacheClient = MemcachedClientBuilder.buildMemcachedClient(
destName = ProdDest,
numTries = 1,
numConnections = 1,
requestTimeout = 50.milliseconds,
globalTimeout = 100.milliseconds,
connectTimeout = 100.milliseconds,
acquisitionTimeout = 100.milliseconds,
serviceIdentifier = serviceIdentifier,
statsReceiver = statsReceiver
)
mkCache(new FinagleMemcache(memCacheClient), statsReceiver)
}
private def mkCache(
finagleMemcache: FinagleMemcache,
statsReceiver: StatsReceiver
): TtlCache[Long, tp.Tweet] = {
val baseCache: KeyValueTransformingTtlCache[Long, String, tp.Tweet, Array[Byte]] =
new KeyValueTransformingTtlCache(
underlyingCache = finagleMemcache,
transformer = tweetsSerializer,
underlyingKey = keyTransformer
)
ObservableTtlCache(
underlyingCache = baseCache,
statsReceiver = statsReceiver.scope(ScopeName),
windowSize = 1000,
name = ScopeName
)
}
}