[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-82162":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":8,"htmlUrl":8,"language":9,"languages":8,"totalLinesOfCode":8,"stars":10,"forks":11,"watchers":12,"openIssues":11,"contributorsCount":11,"subscribersCount":11,"size":11,"stars1d":13,"stars7d":14,"stars30d":15,"stars90d":11,"forks30d":11,"starsTrendScore":16,"compositeScore":11,"rankGlobal":8,"rankLanguage":8,"license":8,"archived":17,"fork":17,"defaultBranch":18,"hasWiki":19,"hasPages":17,"topics":20,"createdAt":8,"pushedAt":8,"updatedAt":21,"readmeContent":22,"aiSummary":23,"trendingCount":11,"starSnapshotCount":11,"syncStatus":24,"lastSyncTime":25,"discoverSource":26},82162,"astra-flux","ZYPGITA\u002Fastra-flux","ZYPGITA",null,"Python",156,0,30,4,69,126,36,false,"master",true,[],"2026-06-12 02:04:23","=========\nAstraFlux\n=========\n\nAstraFlux is a lightweight distributed service framework built around a self-developed dependency injection\ncontainer. It delivers enterprise-grade capabilities - task scheduling with DAG dependencies, RabbitMQ-based\nRPC with circuit breaker, worker management, and a web dashboard - with minimal boilerplate and zero\nexternal orchestration dependencies.\n\nInstall\n=======\n\n.. code-block:: bash\n\n    pip install astraflux\n\n.. code-block:: bash\n\n    https:\u002F\u002Fgithub.com\u002FZYPGITA\u002Fastra-flux\n\nRequires Python 3.9+, with MongoDB, Redis, and RabbitMQ running.\n\nQuick Start\n===========\n\n1. Create a ``config.yaml``\n\n.. code-block:: yaml\n\n    mongodb:\n      host: 127.0.0.1\n      port: 27017\n      username: scheduleAdmin\n      password: scheduleAdminPassword\n\n    redis:\n      host: 127.0.0.1\n      port: 6379\n      password: scheduleAdminPassword\n      db_index: 8\n\n    rabbitmq:\n      host: 127.0.0.1\n      port: 5672\n      username: scheduleAdmin\n      password: scheduleAdminPassword\n\n    logger:\n      path: logs\n      level: INFO\n\n    web:\n      port: 7860\n      username: admin\n      password: admin\n\n    rpc:\n      call_timeout: 30\n      max_retries: 3\n      circuit_breaker_threshold: 5\n      circuit_breaker_recovery: 30\n\n2. Write a service\n\n.. important::\n    The component builder imports the service\u002Fworker module and looks for **exact class names**:\n\n    - ``RpcFunction`` - for the RPC service class\n    - ``WorkerFunction`` - for the worker class\n\n    These class names are hardcoded - *not* configurable - and must match exactly.\n\n.. code-block:: python\n\n    from astraflux import ServiceConstructor, WorkerConstructor, rpc_decorator\n\n    class RpcFunction(ServiceConstructor):\n        service_name = \"my_service\"\n\n        @rpc_decorator\n        def ping(self):\n            return {\"status\": \"ok\"}\n\n        @rpc_decorator\n        def add(self, a: int, b: int) -> int:\n            return {\"result\": a + b}\n\n    class WorkerFunction(WorkerConstructor):\n        worker_name = \"my_service\"\n\n        def run(self, data: dict):\n            self.logger.info(f\"Executing task: {data}\")\n            return {\"status\": \"success\"}\n\n3. Start everything\n\n.. code-block:: python\n\n    from astraflux import AstraFlux, launch_register, launch_start\n\n    AstraFlux(yaml_path=\"path\u002Fto\u002Fconfig.yaml\", current_dir=\"path\u002Fto\u002Fproject\")\n\n    launch_register(services=[RpcFunction, WorkerFunction])\n    launch_start()\n\n    # Keep the process alive\n    import time\n    while True:\n        time.sleep(60)\n\nArchitecture\n============\n\n::\n\n    +---------------------------+\n    |  DI Container (FixtureManager)  |\n    |  Single \u002F Global \u002F Thread scopes|\n    |  Lazy resolution of dependencies|\n    +-------+-------------------+\n            |\n    +-------+------+----------+---------+----------+\n    |       |      |          |         |          |\n    v       v      v          v         v          v\n  MongoDB  Redis  RabbitMQ  Scheduler Executors  Web UI\n  (tasks) (workers) (RPC)   (DAG)    (pools)   (Flask)\n\nConfig propagation::\n\n    config.yaml --> _settings.py (merge defaults) --> fixture_config (dict)\n                                |\n                    Each provider reads config[key]\n                    (No fallback logic in business code)\n\nWhy AstraFlux?\n==============\n\n* **Self-owned DI container** - register once, inject everywhere. No framework lock-in.\n* **Task DAG scheduler** - dependency graphs, failure propagation, subtask management.\n* **Production RPC** - timeout, exponential backoff retry, circuit breaker.\n* **Worker capacity management** - Redis-based slot tracking, automatic scheduling.\n* **Web management UI** - out of the box, tasks, services, system monitoring.\n* **Zero orchestration** - no Kubernetes, no etcd, no ZooKeeper needed.\n\nModules\n=======\n\nDI Container\n------------\n\nThe ``FixtureManager`` is the backbone of AstraFlux. Services are registered as named fixtures\nwith configurable scopes. When a function is called, the container resolves its parameter names\nas fixture names and injects the values automatically.\n\n.. code-block:: python\n\n    @register_fixture(name=\"fixture_config\")\n    def app_config():\n        yield config_data  # merged with defaults\n\n    @register_fixture(name=\"fixture_mongodb\")\n    def task_collection(fixture_config):\n        cfg = fixture_config[\"mongodb\"]\n        yield MongoDatabase(cfg)\n\nSupported scopes:\n\n- ``SINGLETON`` - one instance per process\n- ``GLOBAL`` - cached until explicit ``clear_cache()``\n- ``THREAD`` - one cache entry per thread (thread-safe)\n\nCleanup is built in: when a fixture uses ``yield``, the code after the yield runs on\n``clear_cache()``, making it trivial to release resources.\n\nConfiguration System\n--------------------\n\nAll defaults are defined in constants and merged by the config loader into a complete dict.\nBusiness code reads ``config[key]`` directly - no fallback logic.\n\nCurrently managed config sections:\n\n- ``MONGODB``, ``REDIS``, ``RABBITMQ``, ``LOGGER``, ``RPC``, ``WEB``\n\nIf a config section or key is missing from the YAML file, the system falls back to the\nhardcoded default - every optional field has a sensible default.\n\nDistributed Task Scheduler\n--------------------------\n\nThe scheduler runs as a cron job (every 10 seconds) in a single 8-step cycle:\n\n1. **Fetch** active tasks from MongoDB\n2. **Build** a DAG from task dependencies (``depends_on`` field)\n3. **Propagate failures** - if a parent fails, its children are marked failed\n4. **Find runnable tasks** - all dependencies must be satisfied or in a final state\n5. **Identify priority subtasks** - children of currently running parents get priority\n6. **Dispatch** to RabbitMQ queues, respecting worker capacity per service\n7. **Update** parent statuses based on child completion\n8. **Persist** all status changes back to MongoDB\n\n.. code-block:: python\n\n    from astraflux import task_submit, task_stop, task_retry\n\n    # Submit a task to a specific worker queue\n    task_id = task_submit(worker_name=\"my_service\", body={...})\n\n    # Stop a running task\n    task_stop(task_id)\n\n    # Retry a failed task\n    task_retry(task_id)\n\n    # Subtasks with dependency tracking\n    subtasks_create(\n        subtask_queue=\"my_service\",\n        source_id=task_id,\n        subtask_list=[{...}, {...}]\n    )\n\nThe scheduler runs in ``distributed_unique`` mode by default - only one instance across the\ncluster executes the scheduling cycle. ``ip_unique`` ensures one monitor per host.\n\nRPC\n---\n\nRabbitMQ-based RPC with production-grade reliability:\n\n- **Timeout** - configurable per-call, defaults to 30 seconds\n- **Retry** - exponential backoff with configurable base and max delay\n- **Circuit breaker** - opens after N consecutive failures, recovers after M seconds\n- **Auto-reconnection** - recovers from connection\u002Fchannel errors transparently\n\n.. code-block:: python\n\n    from astraflux import proxy_call, rpc_decorator, start_consumer\n\n    # Client: call a remote method\n    result = proxy_call(\n        service_name=\"my_service\",\n        method_name=\"add\",\n        a=1, b=2\n    )\n\n    # Server: mark methods as remotely callable\n    class RpcFunction(ServiceConstructor):\n        @rpc_decorator\n        def add(self, a, b):\n            return a + b\n\n    # Start consuming RPC requests\n    start_consumer(queue_name=\"my_service\", service_instance=instance)\n\nArguments are serialized with ``dill`` (supports most Python types) and sent to a RabbitMQ\nqueue. The server dispatches by method name and returns the result to a private callback queue.\n\nWorker Management\n-----------------\n\nWorkers are registered in Redis with their capacity and live process list. The scheduler queries\nthis data to decide where to dispatch tasks.\n\n.. code-block:: python\n\n    from astraflux import (\n        redis_store_worker_data,\n        redis_get_available_slots,\n        redis_get_worker_status,\n        get_total_available_slots_by_server_name,\n    )\n\n    # Register a worker\n    redis_store_worker_data({\n        \"unique_id\": \"my_service_192.168.1.10\",\n        \"worker_name\": \"my_service\",\n        \"worker_ipaddr\": \"192.168.1.10\",\n        \"worker_max_process\": 10,\n        ...\n    })\n\n    # Check available capacity before dispatching\n    slots = redis_get_available_slots(unique_id=\"my_service_192.168.1.10\")\n    if slots > 0:\n        # Dispatch task...\n\n    # Service-level capacity summary\n    total_slots = get_total_available_slots_by_server_name(\"my_service\")\n\nEach worker process is spawned by ``multiprocessing.Process`` - fully isolated, robust resource\nmanagement.\n\nLauncher\n--------\n\nThe ``ServiceLauncher`` orchestrates the complete startup sequence. For each registered service:\n\n1. Launch a **service process** - starts an RPC consumer that listens on RabbitMQ\n2. Launch a **worker process** - starts a message queue consumer that processes tasks\n\nThen, if scheduled jobs are enabled:\n\n3. Start the **TaskScheduler** cron job (every 10 seconds, distributed-unique)\n4. Start the **SystemMonitoring** cron job (every 30 seconds, ip-unique)\n5. Optionally launch the **Web UI** as a separate process\n\n.. code-block:: python\n\n    from astraflux import launch_register, launch_start\n\n    launch_register(services=[RpcFunction, WorkerFunction])\n    launch_start(run_app=True, scheduled=True)\n\nThe launcher also handles graceful cleanup via ``kill()`` - terminates all spawned processes.\n\nWeb Management UI\n-----------------\n\nFlask-based dashboard with login authentication, providing:\n\n- **Service monitoring** - platform info, RPC status, function listing\n- **Task management** - submit, stop, retry, paginated task list\n- **Worker status** - live capacity, run processes, available slots\n- **System monitoring** - memory, CPU, disk usage via psutil\n\nAccess: ``http:\u002F\u002F\u003Cbind_ip>:\u003Cport>`` (default ``0.0.0.0:7860``).\n\nExecutors\n---------\n\nThread and process pool executors with built-in retry and progress tracking:\n\n.. code-block:: python\n\n    from astraflux import thread_executor, process_executor\n\n    # Thread pool (shared memory, fast)\n    executor = thread_executor(max_workers=5, retry_delay=1.0)\n    executor.submit(func=my_task, arg1=val1, max_retries=3)\n    executor.start()\n\n    # Process pool (isolated, for CPU-bound work)\n    pe = process_executor(max_workers=4)\n    pe.submit(func=my_cpu_task, data=big_data)\n    pe.start()\n\nFeatures:\n- Exponential backoff retry for failed tasks\n- Task status tracking (pending, running, failed, success)\n- Configurable queue size\n\nConfiguration Reference\n=======================\n\nFull ``config.yaml`` reference:\n\n.. code-block:: yaml\n\n    mongodb:\n      host: 127.0.0.1\n      port: 27017\n      username: scheduleAdmin\n      password: scheduleAdminPassword\n      max_connections: 20\n\n    redis:\n      host: 127.0.0.1\n      port: 6379\n      password: scheduleAdminPassword\n      db_index: 8\n      max_connections: 20\n\n    rabbitmq:\n      host: 127.0.0.1\n      port: 5672\n      username: scheduleAdmin\n      password: scheduleAdminPassword\n\n    logger:\n      path: logs\n      level: INFO\n\n    web:\n      port: 7860\n      bind_ip: 0.0.0.0\n      username: admin\n      password: admin\n\n    rpc:\n      call_timeout: 30\n      max_retries: 3\n      retry_base_delay: 1.0\n      retry_max_delay: 30.0\n      circuit_breaker_threshold: 5\n      circuit_breaker_recovery: 30\n\nAny omitted key falls back to defaults.\n\nLicense\n=======\n\nMIT\n","AstraFlux 是一个轻量级的分布式服务框架，围绕自研的依赖注入容器构建。其核心功能包括基于DAG的任务调度、使用RabbitMQ实现带有断路器模式的RPC调用、工作者管理和Web仪表盘，所有这些功能都以最少的样板代码和零外部编排依赖来提供企业级能力。该框架适合需要高效任务处理、微服务架构以及实时监控的应用场景，如数据处理流水线、批处理作业等。要求Python 3.9及以上版本，并且运行环境需包含MongoDB、Redis和RabbitMQ。",2,"2026-06-11 04:07:55","CREATED_QUERY"]