# misaka **Repository Path**: hello_kuma/misaka ## Basic Information - **Project Name**: misaka - **Description**: 一个分布式处理系统 Slave模式 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-03-10 - **Last Updated**: 2023-03-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # misaka 基本介绍 ## 为什么叫misaka misaka 来自于日本动画 《某科学的超电磁炮》 的御坂美琴, 剧中misaka的 御坂网络 可以在多个御坂美琴的克隆人中进行信号的传递 而misaka 框架也可以类比到一个御坂网络 集群们就是这些克隆人 她们可以帮助 `美琴` 完成许多的请求. ## 用来做什么 #### 基本作用 处理超大型数据 可以使用 `misaka ` 他可以进行如下的操作 - 对数据进行分块发送至指定的服务器进行处理 - 收集多个服务器处理好的数据并进行汇总 所以 misaka 是一个 MasterWorker(ForkJoin) 轻量级框架 #### 使用的业务场景 当然, 你可以在同一台电脑上运行多个子服务器 使用从服务器管理他们 从而实现类似与进程的效果 但是在这种业务环境下你可以使用进程来做一个良好的代替 但是你想处理某个数据 但是数据跑满CPU依旧无法满足你的时间要求 恰好此时你有多余的电脑 这个时候你就可以使用misaka了 ## 提升速度可以其他推荐 如果 `misaka` 无法解决你的需求,在此表示很遗憾,同时我推荐你可以尝试考虑下面的库或者是框架 - Pandas+Numpy 一个广播机制的库 底层是C语言实现的 他的计算速度可以是杠杠滴! - Dask 没有使用这个库 但是外界评价还是很高的你可以去试试 ## 默认端口占用 子服务器*Sister*的端口占用是10032端口 主服务器*Oneesama*的端口占用是10033端口 > PS: 你可以在配置文件中进行修改 ## 与 multiprocessing.managers 的区别 项目写着一半 发现分布式的功能 multiprocessing.managers 已经实现了大部分的功能 所以 misaka 要对multiprocessing.managers 现有的功能进行更加优秀的迭代(真不知道还有这种背刺的) - 他的优点 - multiprocessing 是Python自带的库 会更加的稳定 - 可以支持对一个非迭代对象的计算 - 是Python自己的东西 - 进程间的通信使用Managers就可以了 - 他的缺点(也是才接触这玩意儿 可能对他的理解有所纰漏) - 说实话我才疏学浅不知道这玩意怎么用, 感觉代码没有太清晰 - 管理子服务器不太好 解耦麻烦 - 可以看到的教程太少了 - misaka的优点 - 功能清晰 只有这么多东西 - 文档是中文的(I am Chinese!) - MapReduce很简单 - 当你看到这文本的时候你就看到教程了 - 可以在从服务器中在进行创建一个新的misaka - 具有日志功能 - misaka的缺点 - 配置些许麻烦 - 只支持迭代器对象 - 从服务器之间的通信很麻烦 - 东西还是有点多 感觉没有太轻量级 - 个人开发的 不会太稳定 # misaka 的元素 ## 三大组件 ### SignalSlot 放置在 主从服务器 用于不同角色之间的交流 ### MapReduce MapReduce 是 分组聚合组件 可以对数据进行分组或者是聚合 ### ServerNodeManage 对所有服务器节点的进行管理的类 这个可以上传给他数据或下载服务器的数据处理结果 并且可以动态规划服务器 ## 二大角色 ### Oneesama 放置在 主服务器 > 用于: > > - 分发数据和任务到 `sisters` 从服务器 > - 转发 某个 `从服务器` 的数据到 `全体服务器` ### Sister 放置在 从服务器 > 用于: > > - 接受数据和处理任务 并将结果返回到 `Oneesama` 主服务器上 > - 处理数据中途可以发送通知给 Oneesama Oneesama 在接受到通知后发送给全局服务器们 # misaka 的生命周期 > 前提条件: > > 因为要实现`fork`分布式 推荐你在启动`Oneesama`服务器之前 启动你需要启动`sister`从服务器 ## misaka配置文件 `任意位置都可以放置 (只要你的项目能import到 配置文件)` #### 主服务器的 配置文件的编写 ```python from misaka.error import error import misaka.OneesamaBaseConfig class OneesamaConfig(misaka.OneesamaBaseConfig): def __init__(self): super().__init__() self.sisters = [ # 所有集群(Sisters)的列表 { "ip": "13.41.12.141", # 必要的 服务器的 Ip "name": "ServerName", # 无必要 服务器在YuKiOnna所表示的名称 默认就是ip地址 "porr": 10032, # 无必要 链接该子服务器时 链接的是服务器的哪个端口 "oparetor_policy": Map, # 无必要的 服务器处理数据所使用的策略 默认就是公开策略 "error_policy": error.skip, # 无必要的 服务器处理数据异常的处理策略 "group": "GroupName" # 无必要的 Oneesama 可以给某个Group发送数据与任务 让该组处理 默认没有组. group的值不能是 Any }, ] ``` > 还有在代码没有显示的配置 > > self.logcat = "console" -- 日志输出到控制台 如果不是"console"那就必须是主服务器上的文件名称 > > > > self.port 角色启动使用的端口 self.port='sisdef' 是使用Sister默认的端口, > > self.port='oneedef'是使用Oneesama默认的端口 > > >给服务器设置了group (名称不为public) 之后,如果在调用 `give_sisters` 没有参数`group`的时候 数据就不会传给他啦! 当然你想设置group而且还想让他在无group参数调用`give_sister`的时候可以在他的group值前加上一个public 你可以给一个子服务器设置多个group #### 从服务器的 配置文件的编写 ```python from misaka.error import error import misaka.SisterBaseConfig class SisterConfig(misaka.SisterBaseConfig): def __init__(self): super().__init__() self.logcat = "console" # 日志输出 与Oneesama一致 ``` > self.bufsize 一个sister 最大的接受限制 默认是 `4096**3Byte` 也就是 `4MB` # misaka 的 name 与 group > name推荐是唯一的 group推荐是多个的 两者像是Html中的id 与 class name和group是主服务器对子服务器的两个重要的表示 开发者可以使用name指定对应的套接字或者是group指定对应的套接字组进行工作 而不是全部的集群 ## Group 默认一个套接字的 `name` 是其对应的 `IP`, 而 `group` 默认则是 `Any`, 也就是调用 `give_sisters` 时 `group` 参数值是 `Any` 的时候会发送任务给无 `group` 的套接字——使用无参的`give_sisters`时 只是激活了group为`Any`的套接字。如果想发送任务和数据给任何套接字无论他的`group`值是Any还是其他的时候 可以使用 `give_sisters_all` 方法无差别发送 。 当然`group`值为`pulic`的时候, `misaka` 会认为这是公开套接字, 在调用`give_sisters` 无论group值为任何值 都会发送数据给 `public` 组 # misaka 原理 ## Sister 启动从服务器A的时候 我们会给他建立一个客户端和一个UDP套接字 这个套接字是用来等待主服务器的 因为只有等待到服务器 从服务器才可以知道主服务器的IP地址 这个UDP端口号就是服务器A配置类中的port减去1的值 所以**我们设置从服务器 不要在使用中的端口号和使用中端口号+1 出进行配置服务器** ## Oneesama 启动主服务器的时候不会立即创建服务器 因为我们还没有去通知那些集群来加入我们 所以Oneesama会创建一个UDP依次对配置文件所有的服务器进行通知并且让他们链接Oneesama 只有通知完毕后 Oneesama才会创建主服务器 进行发送数据等操作