本文将介绍如何构建一个使用.NET Core的Twitter流媒体发布器,该发布器能够捕获Twitter的流媒体数据,处理后通过消息代理重新发布文本和头像,以供JavaScript客户端订阅和显示。
应用程序的架构简单但功能强大。有一个发布器应用程序,它从Twitter API消费推文并将其发布到消息代理。代理负责消息的多播和广播,用于将处理过的推文从发布器传输到HTML5消费者。
以下是应用程序的大部分代码,该应用程序消费Twitter流,处理它并重新发布到Emitter。
public class Program {
public static void Main(string[] args) {
// 连接到发射器
var emitter = Connection.Establish();
// 设置凭据 (https://apps.twitter.com)
Auth.SetUserCredentials(
Environment.GetEnvironmentVariable("CONSUMER_KEY"),
Environment.GetEnvironmentVariable("CONSUMER_SECRET"),
Environment.GetEnvironmentVariable("ACCESS_TOKEN"),
Environment.GetEnvironmentVariable("ACCESS_TOKEN_SECRET")
);
// 设置速率限制器,每350毫秒重新发布一条推文
var limiter = new Throttle(1, TimeSpan.FromMilliseconds(350));
// 使用样本流
var stream = Stream.CreateSampleStream();
stream.AddTweetLanguageFilter(LanguageFilter.English);
stream.FilterLevel = Tweetinvi.Streaming.Parameters.StreamFilterLevel.Low;
stream.TweetReceived += (sender, t) => {
// 跳过转推
if (t.Tweet.IsRetweet) return;
// 限制器允许以稳定、视觉上令人愉悦的速率显示推文
var ct = new CancellationToken();
limiter.Enqueue(() => {
// 将推文发布到代理
emitter.Publish(
"IsQ7z18uGEFpjOJpt4K6ij49klT3PGzu",
"tweet-stream",
JsonConvert.SerializeObject(new {
avatar = t.Tweet.CreatedBy.ProfileImageUrl400x400,
text = t.Tweet.Text
}));
}, ct);
};
// 开始
stream.StartStream();
}
}
将使用Docker部署.NET Core发布器。Docker容器将软件包装在一个完整的文件系统中,包含运行所需的一切:代码、运行时、系统工具、系统库 - 任何可以安装在服务器上的东西。这保证了软件将始终以相同的方式运行,无论其环境如何。
开始的最简单的方法之一是使用Dockerfile以及Docker Hub Build Server,它将构建可以在目标机器上部署的镜像。Docker Hub允许自动构建Docker镜像(这里可以将其视为虚拟机镜像),可以部署。该镜像可以设置为在git仓库的每次提交时自动重新构建。
Docker文件如下所示,它做了几件事情,本质上是一个用于创建Docker镜像的脚本:
FROM microsoft/dotnet:1.0.0-preview2-sdk
MAINTAINER Roman Atachiants "roman@misakai.com"
# 确保有S3和额外的库
RUN apt-get update -qq \
&& apt-get install -y git \
&& mkdir /tmp/emitter \
&& cd /tmp/emitter \
&& git clone "https://github.com/kelindar/twitter-stream.git" "/tmp/emitter" \
&& cd /tmp/emitter \
&& dotnet restore -v Minimal \
&& cd /tmp/emitter/src/Server \
&& dotnet publish -c Release --output /app \
&& rm -rf /tmp/emitter
# 应用程序将在app文件夹中
WORKDIR /app
ADD deploy.sh /
CMD ["/bin/bash", "/deploy.sh"]
一旦镜像构建完成,可以通过键入docker run -it kelindar/twitter-stream来启动它,假设已经安装了docker。它将自动从Docker Hub下载镜像并为交互式运行。
与刚刚编写的C#应用程序类似,客户端非常简单直接。实际上,除了依赖项之外,所有的JavaScript代码如下所示。客户端做了几件事情:
// 连接到发射器代理
var emitter = emitter.connect({
secure: true
});
var key = 'jtdQO-hb5jfujowvIKvSF41NeQOE8IoF';
var vue = new Vue({
el: '#app',
data: {
messages: []
}
});
emitter.on('connect', function(){
// 一旦连接,就订阅'tweet-stream'频道
console.log('emitter: connected');
emitter.subscribe({
key: key,
channel: "tweet-stream"
})
});
// 对于每条消息,打印出来
emitter.on('message', function(msg){
// 如果已经有很多消息,删除最旧的一条(第一条)
if (vue.$data.messages.length >= 8){
vue.$data.messages.shift();
}
// 推送收到的消息
vue.$data.messages.push(msg.asObject());
});