the-algorithm/src/scala/com/twitter/recos/user_video_graph/UserVideoGraph.scala

74 lines
2.7 KiB
Scala

package com.twitter.recos.user_video_graph
import com.twitter.finagle.thrift.ClientId
import com.twitter.finagle.tracing.Trace
import com.twitter.finagle.tracing.TraceId
import com.twitter.recos.decider.EndpointLoadShedder
import com.twitter.recos.user_video_graph.thriftscala._
import com.twitter.util.Duration
import com.twitter.util.Future
import com.twitter.util.Timer
import scala.concurrent.duration.MILLISECONDS
import com.twitter.logging.Logger
import com.twitter.recos.user_tweet_graph.relatedTweetHandlers.ConsumersBasedRelatedTweetsHandler
import com.twitter.recos.user_video_graph.relatedTweetHandlers.ProducerBasedRelatedTweetsHandler
import com.twitter.recos.user_video_graph.relatedTweetHandlers.TweetBasedRelatedTweetsHandler
object UserVideoGraph {
def traceId: TraceId = Trace.id
def clientId: Option[ClientId] = ClientId.current
}
class UserVideoGraph(
tweetBasedRelatedTweetsHandler: TweetBasedRelatedTweetsHandler,
producerBasedRelatedTweetsHandler: ProducerBasedRelatedTweetsHandler,
consumersBasedRelatedTweetsHandler: ConsumersBasedRelatedTweetsHandler,
endpointLoadShedder: EndpointLoadShedder
)(
implicit timer: Timer)
extends thriftscala.UserVideoGraph.MethodPerEndpoint {
private val defaultTimeout: Duration = Duration(50, MILLISECONDS)
private val EmptyResponse = Future.value(RelatedTweetResponse())
private val log = Logger()
override def tweetBasedRelatedTweets(
request: TweetBasedRelatedTweetRequest
): Future[RelatedTweetResponse] =
endpointLoadShedder("videoGraphTweetBasedRelatedTweets") {
tweetBasedRelatedTweetsHandler(request).raiseWithin(defaultTimeout)
}.rescue {
case EndpointLoadShedder.LoadSheddingException =>
EmptyResponse
case e =>
log.info("user-video-graph_tweetBasedRelatedTweets" + e)
EmptyResponse
}
override def producerBasedRelatedTweets(
request: ProducerBasedRelatedTweetRequest
): Future[RelatedTweetResponse] =
endpointLoadShedder("producerBasedRelatedTweets") {
producerBasedRelatedTweetsHandler(request).raiseWithin(defaultTimeout)
}.rescue {
case EndpointLoadShedder.LoadSheddingException =>
EmptyResponse
case e =>
log.info("user-video-graph_producerBasedRelatedTweets" + e)
EmptyResponse
}
override def consumersBasedRelatedTweets(
request: ConsumersBasedRelatedTweetRequest
): Future[RelatedTweetResponse] =
endpointLoadShedder("consumersBasedRelatedTweets") {
consumersBasedRelatedTweetsHandler(request).raiseWithin(defaultTimeout)
}.rescue {
case EndpointLoadShedder.LoadSheddingException =>
EmptyResponse
case e =>
log.info("user-video-graph_consumersBasedRelatedTweets" + e)
EmptyResponse
}
}