【实例简介】

Swing星际争霸 游戏源码实例

【实例截图】


文件:590m.com/f/25127180-494082270-f98f4b(访问密码:551685)

以下内容无关:

-------------------------------------------分割线---------------------------------------------

最近维护的一个系统并发有点高,所以想引入一个消息队列来进行削峰。考察了一些产品,最终决定使用kafka来当做消息队列。以下是关于kafka的一些知识的整理笔记。

kafka
kafka 是分布式流式平台。它由linkedin开发,后贡献给了Apache开源组织并成为顶级开源项目。它可以应用在高并发场景下的日志系统,也可以当作消息队列来使用,也可以当作消息服务对系统进行解耦。

流处理平台有以下三种特性:

可以让你发布和订阅流式的记录。这一方面与消息队列或者企业消息系统类似。
可以储存流式的记录,并且有较好的容错性。
可以在流式记录产生时就进行处理。
一般它可以应用于两个场景:

构造实时流数据管道,它可以在系统或应用之间可靠地获取数据。 (相当于message queue)
构建实时流式应用程序,对这些流数据进行转换或者影响。 (就是流处理,通过kafka stream topic和topic之间内部进行变化)
broker
kafka中的每个节点即每个服务器就是一个broker 。

topic
kafka中的topic是一个分类的概念,表示一类消息。生产者在生产消息的时候需要指定topic,消费者在消费消息的时候也需要指定topic。

partition
partition是分区的概念。kafka的一个topic可以有多个partition。每个partition会分散到不同的broker上,起到负载均衡的作用。生产者的消息会通过算法均匀的分散在各个partition上。

consumer group
kafka的消费者有个组的概念。一个partition可以被多consumer group订阅。每个消息会广播到每一个group中。但是每个消息只会被group中的一个consumer消费。相当于每个group,一个partition只能有一个consumer订阅,所以group中的consumer数量不可以超过topic中partition的数量。并且消息的消费的顺序在每个partition中是保证有序的,但是在多个partition之间是不保证的,因为consumer的消费速度是有快慢的。
所以如果要用kafka实现严格的消息队列点对点模式那么我们可以设置一个partition并且设置一个consumer。如果对消息消费的顺序不是那么敏感,那么可以设置多个partition来并行消费消息,提高吞吐量。

安装kafka
为了能体验下kafka,我们还是要实际安装一下kafka,毕竟空想是没有用的。现在有了docker,安装起来也是相当滴简单。我们只需要定义好docker-compose的yml就行了。

version: ‘3’
services:
zookeeper:
image: wurstmeister/zookeeper
ports:
- “2181:2181”
kafka:
image: wurstmeister/kafka
depends_on:
- zookeeper
ports:
- “9092:9092”
environment:
KAFKA_ADVERTISED_HOST_NAME: 192.168.0.117
KAFKA_CREATE_TOPICS: “test:3:1”
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181

我们在yml里定义2个service:

zookeeper,kafka的分布式依赖zookeeper,所以我需要先定义它。
kafka ,kafka的定义有几个地方要注意的。
depends_on:zookeeper 指定kafka依赖zookeeper这个service,当启动kafka的时候自动会启动zookeeper。
KAFKA_ADVERTISED_HOST_NAME 这里要指定宿主机的ip
KAFKA_CREATE_TOPICS 这个变量只是的默认创建的topic。"test:3:1"代表创建一个名为test的topic并且创建3个分区1个复制。
定义好这些之后我们只需要使用docker-compose命令运行它:

sudo docker-compose up -d
.net 操作 kafka
安装好kafka的docker环境之后,下面演示下如何使用.net操作kafka,进行消息的生产与消费。

生产者
static async Task Main(string[] args)
{
Console.WriteLine(“Hello World Producer!”);

        var config = new ProducerConfig{BootstrapServers = "192.168.0.117:9092",ClientId = Dns.GetHostName(),};using (var producer = new ProducerBuilder<Null, string>(config).Build()){string topic = "test";for (int i = 0; i < 100; i++){var msg = "message " + i;Console.WriteLine($"Send message:   value {msg}");var result = await producer.ProduceAsync(topic, new Message<Null, string> { Value = msg });Console.WriteLine($"Result: key {result.Key} value {result.Value} partition:{result.TopicPartition}");Thread.Sleep(500);}}Console.ReadLine();}

新建一个控制台项目,从nuget安装kafka的官方client。

Install-Package Confluent.Kafka
代码非常简单,使用ProducerBuilder构造一个producer,然后调用ProduceAsync方法发送消息。
其中需要注意的是如果你的场景并发非常之高,官方文档推荐的方法是Produce而不是ProduceAsync。这是一个比较迷的地方。按常理使用ProduceAsync应该比使用同步方法Produce能获得更高的并发才对。但是文档确确实实说高并发场景请使用Produce。可能是为了避免ProduceAsync结果返回的时候异步线程上下文切换造成的性能开销。
原文:

There are a couple of additional benefits of using the Produce method. First, notification of message delivery (or failure) is strictly in the order of broker acknowledgement. With ProduceAsync, this is not the case because Tasks may complete on any thread pool thread. Second, Produce is more performant because there is unavoidable overhead in the higher level Task based API.
消费者
static void Main(string[] args)
{
Console.WriteLine(“Hello World kafka consumer !”);

        var config = new ConsumerConfig{BootstrapServers = "192.168.0.117:9092",GroupId = "foo",AutoOffsetReset = AutoOffsetReset.Earliest};var cancel = false;using (var consumer = new ConsumerBuilder<Ignore, string>(config).Build()){var topic = "test";consumer.Subscribe(topic);while (!cancel){var consumeResult = consumer.Consume(CancellationToken.None);Console.WriteLine($"Consumer message: { consumeResult.Message.Value} topic: {consumeResult.Topic} Partition: {consumeResult.Partition}");}consumer.Close();}}

消费者的演示代码同样很简单。我们需要指定groupId,然后订阅topic。使用ConsumerBuilder构造一个consumer,然后调用Consume方法进行消费就可以。
注意:
这里默认是自动commit消费。你也可以根据情况手动提交commit。

运行一下

我们运行一个生产者进程,按照500ms的速度生产消息。运行三个consumer进行消费,可以看到消息被均匀的推送到三个consumer上去。

总结
以上简单的介绍了kafka的背景、安装方法、使用场景。还简单演示了如何使用.net来操作kafka。它可以当作流式计算平台来使用,也可以当作传统的消息队列使用。它当前非常流行,网上的资料也多如牛毛。官方也提供了简单易用的.net sdk ,为.net 平台集成kafka提供了便利。

Swing星际争霸 游戏源码实例,仅供开发学习交流相关推荐

  1. 合成大西瓜小程序小游戏源码,仅供学习

    近日,一款名为[合成大西瓜]的休闲小游戏火爆社交圈.[合成大西瓜]因其玩法简单.充满魔性而频登微博热搜,游戏开发商微伞小游戏在昨日顺势上线了"合成大西瓜"APP. 起初,大家对这种 ...

  2. java手机游戏星际争霸_java Swing实现的星际争霸游戏源码

    今天给大家介绍一下由Java swing实现的星际争霸游戏项目,该项目实现了单人模式和多人合作模式,可记录游戏进度,新建游戏,载入历史记录等功能,多人模式下可以创建一个区,然后邀请玩家加入一起玩,主要 ...

  3. java大作业的打猎游戏_Java Swing打猎射击游戏源码

    Java Swing打猎射击游戏源码 代码如下package Game;import java.awt.Graphics;import java.awt.Image;import javax.swin ...

  4. 租房系统源码(仅供参考)

    租房系统源码(仅供参考) https://gitee.com/AutisticRoad/background-management-system

  5. java swing飞机大战游戏(源码+视频+文档+ppt)

    该项目是由Java swing实现的一款小游戏飞机大战,模仿的是微信版的飞机大战之打飞机小游戏,可在Java环境下运行,jdk版本不限,非常适合Java学习者参考学习,此外附带有视频导入教程,手把手教 ...

  6. java射击游戏_Java Swing打猎射击游戏源码

    代码如下 package Game; import java.awt.Graphics; import java.awt.Image; import javax.swing.JPanel; publi ...

  7. 220多款H5的手机端小游戏源码下载 - html+javascript 开发网页小游戏开源源码大合集

    演示端:http://game.tutou.wang/  (手机访问) 需要做二次开发或者游戏开发的自行下载. 链接:https://pan.baidu.com/s/1kOOagUC1N6KnKBRK ...

  8. 226款H5手机端小游戏源码下载 - HTML+JavaScript开发的网页小游戏开源源码大合集,经过亲测可用!

    演示端:http://game.tutou.wang/  (手机访问)  可在线试玩的分享. 链接:https://pan.baidu.com/s/1-R6wEZjLXYm0iowBJLFS8g?pw ...

  9. python计算机二级题库(免费)(仅供个人学习交流使用侵删)

    直接上链接₍˄·͈༝·͈˄*₎◞ ̑̑

  10. android扫雷小游戏制作,android扫雷小游戏源码

    [实例简介] 一个简易的扫雷小游戏源码,可供android初学者参考学习 [实例截图] [核心代码] MineSweep └── MineSweep ├── AndroidManifest.xml ├ ...

最新文章

  1. mysql多表连接 索引_MySQL多表查询之外键、表连接、子查询、索引
  2. MySQL 数据库修改访问权限,不能使用ip连接mysql问题处理:Host ‘host.docker.internal‘ is not allowed to connect to this ...
  3. java 判断题_Java面试题及解析(判断题)
  4. tableau certificate
  5. 北邮OJ 90. 字符串转换
  6. VTK:网格之PointInterpolator
  7. vector赋值的常见错误
  8. 计算机网络——基本介绍
  9. 利用中值滤波而不是均值滤波去除椒盐噪声(脉冲噪声)
  10. Sound Studio for Mac - 音频编辑处理工具
  11. DM365的UBL源码分析(二)
  12. NLP-文本处理:词性消歧
  13. 外地新能源汽车迁入北京需要哪些条件?
  14. 1143 -- 函数解析式
  15. 分散层叠(Fractional Cascading)
  16. linux系统etc什么意思,请问linux下的etc是什么意思?
  17. 08年监理工程师,一级建造师考前强化培训班招生
  18. aws安装(centos)
  19. 2022年全国职业院校技能大赛(中职组)网络安全竞赛试题(10)(总分100分)
  20. 计算机应用技术要打字快,怎么快速练习计算机打字?

热门文章

  1. 奇舞团- 招高级iOS开发工程师
  2. 多款AGV模型3D图纸 零件图,装配图都有 潜伏式,搬运AGV,内部结构详细
  3. 我喜欢生命本来的样子--周国平
  4. windows虚机使用IIS服务搭建ftp
  5. 私有云服务器和公有云服务器有什么区别
  6. 微信小程序清除缓存(ios和安卓的解决方法)
  7. C语言错误类型中英文对照表
  8. 【详细教程·本人亲测】解决win10家庭版系统C:\Users用户名中有中文,更改为英文的问题
  9. RPG像素游戏角色大合集
  10. 数字锁相ud,uq的关系