{"id":19990761,"url":"https://github.com/FarseerNet/fss.net","last_synced_at":"2025-05-04T10:30:43.530Z","repository":{"id":202084024,"uuid":"360808096","full_name":"FarseerNet/fss.net","owner":"FarseerNet","description":"跨语言分布式的调度中心（基于.NET CORE 5 语言编写）","archived":true,"fork":false,"pushed_at":"2023-03-04T05:07:36.000Z","size":587,"stargazers_count":11,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"main","last_synced_at":"2024-11-13T04:52:39.724Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/FarseerNet.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2021-04-23T08:00:29.000Z","updated_at":"2023-03-04T05:08:05.000Z","dependencies_parsed_at":"2023-11-10T11:43:04.595Z","dependency_job_id":null,"html_url":"https://github.com/FarseerNet/fss.net","commit_stats":null,"previous_names":["farseernet/fss.net"],"tags_count":6,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FarseerNet%2Ffss.net","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FarseerNet%2Ffss.net/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FarseerNet%2Ffss.net/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FarseerNet%2Ffss.net/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/FarseerNet","download_url":"https://codeload.github.com/FarseerNet/fss.net/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252319954,"owners_count":21729039,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-13T04:51:27.688Z","updated_at":"2025-05-04T10:30:42.769Z","avatar_url":"https://github.com/FarseerNet.png","language":"C#","readme":"# 停止更新\n感谢大家一直以来的支持，我们于2023年03月03日发布了FSS2.0并更名为FShedule\n\n2.0采用go语言设计，因此1.0（.NET设计）将不再更新维护。\n\n2.0，请前往：[https://github.com/FSchedule/FSchedule](https://github.com/FSchedule/FSchedule)\n\n## FSS是什么？\n\n一款跨语言分布式的调度中心（基于`.NET CORE 5`语言编写）。\n\n服务端：推荐运行在`docker on k8s`下\n客户端：是我们要运行的任务，你可以使用自己的控制台（`Console`）、`ASP.NET CORE`程序\n\nGitHub：https://github.com/FarseerNet/FarseerSchedulerService\n\nDocker：https://hub.docker.com/r/farseernet/fss\n\n10 m2860.28 Mi\n\n## 设计目标\n\n高可用（HA）：`多实例`的job客户端。同一个任务、同一个job实例只会被调度一次\n\n快速搭建：`服务端`可运行于docker或k8s下，1分钟即可把服务部署到您的生产环境中\n\n轻量级：`低内存`（没有客户端连接的时候130m，有任务的时候250m）、`低CPU消耗`，依赖少。\n\n动态执行：可定时、间隔时间、Cron、或由业务方job动态设定下次执行时间。\n\n快速上手：借助Farseer.Net.Job组件（开源在github，并提供nuget包），可以快速实现一个job\n\n可视化：借用FOPS，可以维护任务组，查看任务进度、耗时、日志。\n## 服务端搭建\n\n    Docker （运行在docker或k8s下）\n    Net 5.0 （提供docker.hub镜像服务)\n    Redis （用与多节点之间的数据同步）\n    Sqlserver/MySql/Oracle（常用数据库任意选一个）\n    建议：多实例运行\n\n`1、数据库（你也可以换其它数据库）`\n\n[Mysql脚本](https://raw.githubusercontent.com/FarseerNet/FarseerSchedulerService/main/07_Solution%20Items%EF%BC%88%E9%A1%B9%E7%9B%AE%E6%96%87%E4%BB%B6%EF%BC%89/fss.sql)\n\n`2、docker运行脚本`\n\n```\ndocker run -d --name fss -p 888:888 \\\n-e Database__default=\"DataType=MySql,Server=mysql:3306,UserID=root,PassWord=steden@123,Catalog=fss,PoolMaxSize=50,PoolMinSize=1\" \\\n-e Redis__default=Server=\"Server=redis:6379,DB=13,Password=123456,ConnectTimeout=600000,SyncTimeout=10000,ResponseTimeout=10000\" \\\n-e ElasticSearch__es=\"Server=http://es:9200,Username=es,Password=123456\" \\\n-e ElasticSearch__LinkTrack=\"Server=http://es:9200,Username=es,Password=123456\" \\\n--network=net farseernet/fss:latest \\\n--restart=always\n```\n\n你也可以使用挂载配置的方式\n```\ndocker run -d --name fss -p 888:888 \\\n-v /home/appsettings.json:app/appsettings.json \\\nfarseernet/fss:latest --restart=always\n```\n\n环境变量解释：\n\n|  环境变量   | 说明  |\n|  ----  | ----  |\n| FSS__Server  | 当前FSS地址 |\n| Database__default  | 数据库地址 |\n| Redis__default  | redis地址 |\n| ElasticSearch__es  | es地址，用于写入日志，不填，则使用数据库记录 |\n| ElasticSearch__LinkTrack  | 链路追踪的ES地址，默认启用 |\n\n\n## 客户端使用\n\n### 1、通过Farseer.Net.Job组件\n\n    netstandard2.0\n    Farseer.Net.Job 开源组件 可以实现快速接入1分钟上手（如不依赖，需自行对接）\n    建议：多实例运行\n\n运行job的程序在启动之后会做：\n\n    1、向FSS调度平台注册客户端的信息打开Channel。（如多个server，会打开多个，断开后自动重连）\n    2、实时接收FSS调度平台的消息通知\n\n`客户端appsettings.json配置`\n\n```json\n{\n  \"FSS\": {\n    // FSS平台地址（多节点用,分隔）\n    \"Server\": \"http://localhost,http://localhost\"\n  }\n}\n```\n\n`Program.cs`\n\n```c#\n[Fss] // 开启后，才能注册到FSS平台\npublic class Program\n{\n    public static void Main()\n    {\n        // 初始化模块\n        FarseerApplication.Run\u003cStartupModule\u003e().Initialize();\n        Thread.Sleep(-1);\n    }\n}\n```\n\n`StartupModule.cs`\n\n```c#\n/// \u003csummary\u003e\n/// 启动模块\n/// \u003c/summary\u003e\n[DependsOn(typeof(JobModule))] // 依赖Job模块\npublic class StartupModule : FarseerModule\n{\n}\n```\n\n`HelloWorldJob.cs`\n\n```c#\n[FssJob(Name = \"testJob\")] // Name与FSS平台配置的JobName保持一致\npublic class HelloWorldJob : IFssJob\n{\n    /// \u003csummary\u003e\n    /// 执行任务\n    /// \u003c/summary\u003e\n    public Task\u003cbool\u003e Execute(IFssContext context)\n    {\n        // 告诉FSS平台，当前进度执行了 20%\n        context.SetProgress(20);\n\n        // 让FSS平台，记录日志\n        context.Logger(LogLevel.Information, \"你好，世界！\");\n\n        // 下一次执行时间为10秒后（如果不设置，则使用任务组设置的时间）\n        context.SetNextAt(TimeSpan.FromSeconds(1));\n\n        // 任务执行成功\n        return Task.FromResult(true);\n    }\n}\n```\n### 2、通过http调用 （application/json）\nheader data（所有接口都需要带入）:\n```json\n{\n    \"ClientIp\" : \"请获取你的客户端IP\",\n    \"ClientId\" : 1465307444889034752, // 19位 int64，随机生成。同一个实例，此ID必须一致。\n    \"ClientName\" : \"客户端名称，推荐取当前hostname\",\n    \"ClientJobs\" : \"testJob\" // jobName,多个用,分开。这里告知FSS，我当前能处理的job。\n}\n```\n#### 2.1 拉取任务：\nhttp://{fss_server}/task/pull\n\npost:\n```json\n{\n    \"TaskCount\" : 10 // 本次拉取的数量\n}\n```\n说明：`FSS`返回的任务是包含在15S内将要执行的任务，因此在您拉取到任务后，需根据当前任务的执行时间，自行做Thread.Sleep线程休眠。\n\n#### 2.2 提交任务状态：\nhttp://{fss_server}/task/JobInvoke\n\npost :\n```json\n{\n    \"TaskGroupId\" : 11, // 任务组ID\n    \"NextTimespan\" : 0, // 时间戳（毫秒），0：根据任务组的设置。\u003e0 ：按当前传入的值为下一次执行时间\n    \"Progress\" : 20, // 当前进度：0~100\n    \"Status\" : 2, // 任务的执行状态：0、未开始，1、已调度，2、执行中，3、失败（完成），4、成功（完成）\n    \"RunSpeed\" : 1000, // 毫秒，当前任务执行耗时。\n    \"Log\" : { // 日志\n        \"LogLevel\" : 1000, // 日志等级,Trace=0,Debug=1,Info=2,Warning=3,Error=4,Critical=5\n        \"Log\" : \"日志内容\",\n        \"CreateAt\" : \"2021-11-30 17:25:31\", // 记录时间\n    }, \n    \"Data\" : { // 数据,json结构。传入后，会保存到任务组中，供下一次执行时使用。\n        \"Key1\":\"Value1\",\n        \"Key2\":\"Value2\",\n        \"Key3\":\"Value3\",\n    }, \n}\n```\n\n共2个接口，实现任务的拉取，任务的执行状态反馈，任务的日志。\n\n说明：当任务拉取后开始执行时，应立即请求`JobInvoke`接口，并传入Status=2。告知`FSS`，任务正在执行。\n\n任务状态共有5种：0、未开始，1、已调度，2、执行中，3、失败（完成），4、成功（完成）\n\n当任务未被调度给客户端时，此时任务的状态=0(未开始)。\n\n当客户端拉取任务后，此时的状态=1(已调度).\n\n当客户端拿到任务，并根据任务的StartAt时间，开始执行任务对应的JOB时，应立即提交接口2，并将状态=2(执行中)\n\n在执行过程中，需要提交日志时。通过接口2，可将日志提交给FSS服务端。\n\n在任务执行完成（成功 or 失败）时，通过接口2，并将状态=3|4（选其中一种），提交到FSS。以此结束任务。\n\n## UI控制台\n请参考：https://github.com/FarseerNet/FOPS\n\n支持对任务的编辑设置、查看当前实时的任务状态、任务日志。\n\n基于ASP.NET Core Blazor 5语言编写\n\n## 任务组\n\n任务组：是要执行任务的基本信息：任务名称、开始时间、执行次数、执行耗时、启用状态、下一次执行的任务ID。\n\n任务：是在任务组设定并启用后动态创建并由系统自动维护的任务信息，可以知道某次的任务是由哪个客户端执行，执行状态（成功、失败），执行耗时等信息。\n\n    当任务组启用后，会创建一条任务信息，并标记为该任务的执行开始时间，是否执行的状态。\n    调度器通过这个任务建立时间轮，来轮询时间格。\n","funding_links":[],"categories":["C\\#"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FFarseerNet%2Ffss.net","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FFarseerNet%2Ffss.net","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FFarseerNet%2Ffss.net/lists"}